aardio 文档

aardio 范例: cURL » inet.http

请参考 curl 转 web.rest | 基于 string.curlParse

/*
请参考 curl 转 web.rest: https://www.aardio.com/zh-cn/doc/example/Web/REST/curlParse.html 
基于 string.curlParse: https://www.aardio.com/zh-cn/doc/library-reference/string/curlParse.html
*/
import win.ui;
import win.ui.simpleWindow;
import win.ui.tooltip;
import fonts.fontAwesome;
import win.clip;
import web.form.simpleMarkdown;
import inet.curlParse;
/*DSG{{*/
var winform = win.form(text="CURL 转 aardio 代码";right=1019;bottom=619;bgcolor=0xFFFFFF;border="none")
winform.add(
btnClear={cls="plus";text="清空";left=111;top=572;right=187;bottom=605;align="left";color=0x666666;db=1;dl=1;font=LOGFONT(h=-13);iconStyle={align="left";font=LOGFONT(h=-14;name='FontAwesome');padding={left=12}};iconText='\uF12D';notify=1;textPadding={left=33};z=8};
btnConvert={cls="plus";text="转换代码";left=727;top=572;right=850;bottom=605;align="left";bgcolor=0x8B5CCF;color=0xFFFFFF;db=1;dr=1;font=LOGFONT(h=-14;weight=600);iconStyle={align="left";font=LOGFONT(h=-16;name='FontAwesome');padding={left=18}};iconText='\uF061';notify=1;textPadding={left=42};z=9};
btnCopy={cls="plus";text="复制代码";left=866;top=572;right=986;bottom=605;align="left";bgcolor=0x10B981;color=0xFFFFFF;db=1;dr=1;font=LOGFONT(h=-13;weight=600);iconStyle={align="left";font=LOGFONT(h=-14;name='FontAwesome');padding={left=15}};iconText='\uF0C5';notify=1;textPadding={left=42};z=10};
btnPaste={cls="plus";text="粘贴";left=30;top=572;right=106;bottom=605;align="left";color=0x666666;db=1;dl=1;font=LOGFONT(h=-13);iconStyle={align="left";font=LOGFONT(h=-14;name='FontAwesome');padding={left=12}};iconText='\uF0EA';notify=1;textPadding={left=33};z=7};
chkCeanHeaders={cls="plus";text="精简请求头";left=479;top=576;right=604;bottom=607;align="left";db=1;dl=1;font=LOGFONT(h=-15);iconStyle={align="left";font=LOGFONT(h=-15;name='FontAwesome')};iconText='\uF0C8 ';notify=1;textPadding={left=24};z=14};
chkUserAgent={cls="plus";text="User-Agent";left=353;top=575;right=472;bottom=606;align="left";db=1;dl=1;font=LOGFONT(h=-15);iconStyle={align="left";font=LOGFONT(h=-15;name='FontAwesome')};iconText='\uF0C8 ';notify=1;textPadding={left=24};z=13};
chkWinHttp={cls="plus";text="inet.whttp";left=232;top=575;right=339;bottom=606;align="left";db=1;dl=1;font=LOGFONT(h=-15);iconStyle={align="left";font=LOGFONT(h=-15;name='FontAwesome')};iconText='\uF0C8 ';notify=1;textPadding={left=24};z=15};
customOutput={cls="custom";left=474;top=62;right=990;bottom=558;db=1;dl=1;dr=1;dt=1;z=6};
editInput={cls="richedit";left=30;top=62;right=463;bottom=558;db=1;dl=1;dt=1;edge=1;hscroll=1;multiline=1;vscroll=1;z=5};
inputPanel={cls="bkplus";left=15;top=62;right=462;bottom=558;bgcolor=0xFAFAFA;border=1;db=1;dl=1;dt=1;z=4};
lnkDocument={cls="syslink";text="文档指南";left=651;top=578;right=703;bottom=604;align="center";center=1;db=1;dr=1;transparent=1;z=12};
splitter={cls="splitter";left=466;top=62;right=471;bottom=558;db=1;dl=1;dt=1;frame=1;z=11};
titleBar={cls="bkplus";left=0;top=0;right=1020;bottom=52;bgcolor=0x8B5CCF;dl=1;dr=1;dt=1;z=1};
titleIcon={cls="bkplus";text='\uF120';left=18;top=12;right=48;bottom=42;color=0xFFFFFF;dl=1;dt=1;font=LOGFONT(h=-22;name='FontAwesome');z=2};
titleText={cls="bkplus";text="CURL(bash) 转 aardio 代码 (inet.http / whttp)";left=52;top=12;right=550;bottom=42;align="left";color=0xFFFFFF;dl=1;dt=1;font=LOGFONT(h=-18;weight=600);z=3}
)
/*}}*/

// 初始化 Markdown 视图
var wb = web.form.simpleMarkdown(winform.customOutput);
var lastGeneratedCode = ""; // 记录最后生成的代码

// 转换逻辑
winform.btnConvert.oncommand = function(id,event){
    var curl = winform.editInput.text;
    if(!#string.trim(curl)){
        winform.msgbox("请先输入 CURL 命令", "提示");
        winform.editInput.setFocus()
        return;
    }

    // 禁用按钮并显示动画
    winform.btnConvert.disabledText = {'\uF254';'\uF251';'\uF252';'\uF253';'\uF250'}

    wb.setMarkdown("")
    wb.showLoading('正在转换 cURL 命令为 aardio 代码 ...');

    // 异步解析(避免界面卡死)
    thread.invoke( 
        function(winform,wb,curl){
            // 线程内必须重新导入需要使用的库
            import inet.curlParse;

            var code, err = inet.curlParse(curl,{
                whttp = winform.chkWinHttp.checked;
                userAgent = winform.chkUserAgent.checked;
                cleanHeaders = winform.chkCeanHeaders.checked;
            });

            winform.btnConvert.disabledText = null;
            if(!code){  
                wb.showError(err : "转换失败,请检查格式");
                return;
            }

            // winform, wb 等对象传递到线程是安全的(自动封装了线程消息转发)
            wb.writeDelta('```aardio\n')
            winform.lastGeneratedCode = code;

            for(line in string.lines(code)){  
               wb.writeDelta(line+'\n');  
            }
            wb.writeDelta( '\n```');
            wb.writeDelta(null)

        },winform,wb,curl
    )
}

// 粘贴
winform.btnPaste.oncommand = function(id,event){
    var text = win.clip.read();
    if(#text){
        winform.editInput.text = text;
        winform.editInput.setFocus();
    }
}

// 清空
winform.btnClear.oncommand = function(id,event){
    winform.editInput.text = "";
    wb.write("");
    lastGeneratedCode = "";
    winform.editInput.setFocus();
}

// 复制
winform.btnCopy.oncommand = function(id,event){
    if(!#winform.lastGeneratedCode){
        winform.msgbox("没有可复制的代码", "提示");
        return;
    }

    win.clip.write(winform.lastGeneratedCode);

    var originalText = winform.btnCopy.text;
    var originalIcon = winform.btnCopy.iconText;
    winform.btnCopy.text = "已复制";
    winform.btnCopy.iconText = '\uF00C';

    winform.setTimeout(function(){
        winform.btnCopy.text = originalText;
        winform.btnCopy.iconText = originalIcon;
    }, 1000)
}

// 快捷键 
winform.editInput.onOk = function(ctrl,alt,shift){ 
    if(ctrl){
        winform.btnConvert.oncommand();
        return true;
    }   
}

// 分割条关联
winform.splitter.split(winform.editInput, winform.customOutput);

// 按钮皮肤设置(skin 中颜色必须是 0xAARRGGBB 格式)
winform.btnConvert.skin({
    background={
        default=0xFFCF5C8B;
        hover=0xFFE06C9B;
        active=0xFFBF4C7B;
        disabled=0xFFCCCCCC
    };
    color={default=0xFFFFFFFF};
    border={default={radius=4}}
})

var graySkin = {
    background={
        default=0xFFF2F2F2;
        hover=0xFFE5E5E5;
        active=0xFFD9D9D9
    };
    color={default=0xFF666666};
    border={radius=4;color=0xFFDBDBDB;width=1}
}
winform.btnPaste.skin(graySkin);
winform.btnClear.skin(graySkin);

winform.btnCopy.skin({
    background={
        default=0xFF81B910;
        hover=0xFF91C920;
        active=0xFF71A900
    };
    color={default=0xFFFFFFFF};
    border={default={radius=4}}
})

wb.write("#### 操作步骤`
👈 请在左侧粘贴 **cURL(bash)** 命令,点击 **转换代码** 或按 `Ctrl + Enter`。

### inet.http 与 inet.whttp 区别
| 特性 | inet.http <span style=""background: linear-gradient(135deg, #84fab0 0%, #8fd3f4 100%); padding: 3px 10px; border-radius: 5px; font-family: 'Segoe UI', Tahoma, sans-serif; font-size: 0.80em; color: #155724; font-weight: 500; border: 1px solid rgba(132, 250, 176, 0.5);"">✓ 推荐<span> | inet.whttp |
|------|-----------|------------|
| 底层 API | WinINet | WinHTTP |
| Cookie 管理 | 自动(与 web.form 共享) | 需手动处理 |
| 适用场景 | 桌面客户端 | NT 服务/后台程序 |

#### 快捷转换
复制 **cURL(bash)** 命令,在 aardio 编辑器按 `Ctrl+Shift+V`(或点右键菜单项:粘贴与更正)可转换 `curl` 命令为 web.rest 代码。

> 示例 <a href='javascript:void(0)' onclick='javascript:external.post()'>» POST 请求(文件表单)</a> <a href='javascript:void(0)' onclick='javascript:external.get()'>» 发送 GET 请求</a>  <a href='javascript:void(0)' onclick='javascript:external.cookies()'>» 指定 Cookies</a>  
");

wb.external = {
    get = function(){
        winform.editInput.text = /*
curl "https://httpbin.org/anything?page=1&lang=zh-CN" \
  -H "Referer: https://www.google.com/" \
  -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" \
  -b "session_id=xyz123; theme=dark" \
  --compressed
        */
    };
    post = function(){
        winform.editInput.text = /*
curl -X POST "https://httpbin.org/anything" \
  -F "username=aardio_user" \
  -F "doc=@~\doc\guide\language\syntax-quick-ref.md" \
  -H "X-Custom-Header: demo"
        */
    };
    cookies = function(){
        winform.editInput.text = /*
curl -H "Accept: application/json" \
  -b "name=value; name2=value2" https://httpbin.org/cookies
        */
    };
}

win.ui.simpleWindow(winform);
winform.show();

// 自动检测剪贴板
var text = win.clip.read();
if(inet.curlParse.test(text)){
    winform.editInput.text = text;
}
else{
    winform.editInput.setFocus()
}

// 2. 文档链接处理
winform.lnkDocument.link = "https://www.aardio.com/zh-cn/doc/library-guide/std/inet/http.html";
winform.lnkDocument.onHyperlinkClick = function(nmSysLink,url,id,index){ 
    if(_STUDIO_INVOKED){
        import ide;
        ide.openDocument("https://www.aardio.com/zh-cn/doc/library-guide/std/inet/http.html");
    }
    else {
        import process;
        process.openUrl("https://www.aardio.com/zh-cn/doc/library-guide/std/inet/http.html");
    }
}

winform.chkCeanHeaders.checked = true;

winform.chkWinHttp.skin({
    color={
        active=0xFF00FF00;
        default=0xFF000000;
        disabled=0xEE666666;
        hover=0xFFFF0000        
    };
    checked={
        iconText='\uF14A'       
    }
})

winform.chkCeanHeaders.skin({
    color={
        active=0xFF00FF00;
        default=0xFF000000;
        disabled=0xEE666666;
        hover=0xFFFF0000        
    };
    checked={
        iconText='\uF14A'       
    }
})

winform.chkUserAgent.skin({
    color={
        active=0xFF00FF00;
        default=0xFF000000;
        disabled=0xEE666666;
        hover=0xFFFF0000        
    };
    checked={
        iconText='\uF14A'       
    }
})
win.loopMessage();
Markdown 格式