请参考 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 格式