cURL ⇄ 代码

粘贴 curl 命令拆成请求要素,再导出 Node/Python/Go/Fetch 代码。

分三步走。先按 bash 的引用规则把一条命令切成 token,再把选项归进一个内部请求对象:方法、URL、请求头、Cookie、Basic 凭据、body、表单字段、代理、两个超时、重试、Range、重定向与证书开关,最后按目标语言渲染。两条方向并不对称:curl → 代码有多个目标语言,反向只有 Python requests → curl,用的是真正读括号、引号、字典、元组的结构解析器而不是正则糊。

剩下的选项有两种结局,都会逐条写在输出里:能给理由的标成忽略,会读盘或需要往返的标成拒绝;完全不认识的名字进「无法等价表达」清单——真 curl 遇到不认识的长选项会直接报错退出,这里不中断,但提醒紧跟它的那个裸词可能被当成 URL。其他语言的调用片段翻不回来,把 wget、httpie、xh 命令粘进来也会被拒(wget 在这里只是输出目标)。整页不执行命令、不发请求、不读文件、不联网,切词与渲染都在你浏览器里的脚本中完成:命令里通常带着 token、Cookie 和内网地址,这类输入本来就不必经过任何服务端。

cURL ⇄ 代码怎么用

  • 先选方向再选语言:顶部「curl → 代码 / Python → curl」切的是输入与输出的语义。反向只有一个出口,所以目标语言那个下拉框整块从页面里消失(不是留着一个点了没用的控件),「一次给出全部 9 种」那折也一并收掉,输入框标题换成 Python requests 调用、输出标题换成规范化 curl(单引号安全转义、参数缩进两格、续行反斜杠),此时只剩「边界与说明(N 条)」一折。curl → 代码下目标语言是下拉框,9 项按顺序排着,默认选中的是 Node fetch。
  • 两折都是点开才算:「解析结果与边界(结构 N 行 · 说明 N 条)」和「一次给出全部 9 种语言」都是原生 <details>,默认收起、收起时里面是空的——展开那一刻才把表格和代码写进 DOM,输入变了会把两折清空重来。前一折讲清当前选中那一种语言的去向:方法与 URL,来源/路径/查询/片段逐项拆开(片段标明不会发给服务器),请求头逐条列出,凭据口令显示为掩码,body 标明是 multipart、表单还是原文,再加两个超时、证书校验、重定向与代理,后面接被拒的选项、无法等价表达的选项和全部忽略说明。后一折只有代码:9 块按同一个顺序铺开,每块标题给「N 行 · 扩展名」,块内超高自己滚;每种的说明只在当前选中项那折里,这里不重复。想确认翻译是否等价,看前一折比看代码快。
  • 失败长什么样:空输入、找不到 curl 本体、以 wget/httpie/xh 开头、命令里没有任何 URL、超过 20000 字符,都会给一条可读错误并停下;选项缺取值记成拒绝项,URL 不是「协议://主机」形式、协议不是 http/https、URL 里有通配符(curl 会展开成多次请求)这类只作说明不作拒绝,其余部分照常翻译。报错与空输入时两折都直接从页面里撤掉,不会留着上一次的结果。
  • 被认真翻译的选项:被认真翻译的选项:-X/--request、--url 与位置参数(多个 URL 只翻译第一个并说明「那是一次循环,没有等价写法」)、-G(把数据并进查询串,注意它不额外编码,除非取值来自 --data-urlencode)、--url-query、-I/--head、-H(按第一个冒号切;只给头名不给冒号的写法在 curl 里表示显式不发这个头,于是整行被丢弃并说明)、-A、-e、-b(只接 name=value 串,看着像文件名的直接拒)、-u、-d/--data/--data-ascii/--data-raw/--data-binary/--data-urlencode(多次取值一律用 & 连接,urlencode 按 name= 只编右边、其余整串编码的规矩做百分号编码)、-F/--form/--form-string(认 type= 与 filename=,值里的分号要写成 \;,文件字段拒绝)、--json(补出 Accept 与 Content-Type 两行)、-L/--max-redirs、-m/--connect-timeout、-k、-x 与 --socks4/--socks5/--socks5-hostname/--noproxy、-r/--range、--retry、--compressed、-v,以及 --if-modified-since、--if-none-match、--if-unchanged、--if-range 四个条件请求头。
  • 忽略类与拒绝类名单:忽略类主要是终端与传输层的:-s/-S/--progress-bar/--no-buffer/-i、-w/--write-out、-f/--fail(说明里给出代码里的等价写法 if (res.status >= 400) throw)、--http1.1/--http2/--http3/-0/--tcp-nodelay/--no-keepalive/--interface/--local-port/--unix-socket/--resolve/--connect-to/--dns-servers/--doh-url/--limit-rate/--rate/--retry-delay/--retry-max-time/--retry-all-errors/--expect100-continue/--path-as-is/--post301/302/303/--time-cond/--globoff,以及 -Z/--next 之后的第二条命令与 --parallel。拒绝类是所有要读本地文件或写盘的(-o/-O/--output/--create-dirs/--dump-header/-c/--cookie-jar/--cacert/--capath/--cert/--key/--pass/--config/--trace/--alt-svc/--pinnedpubkey/--crlfile/-C/--upload-file)、需要一轮往返或系统凭据的认证(--digest/--ntlm/--negotiate/--aws4/--oauth2/--netrc,--bearer 只让你自己写 Authorization 头),以及 TLS 版本与密码套件开关。

常见问题

--data、--data-raw、--data-binary、--data-urlencode 在生成的代码里有区别吗?

只有编码这一条:urlencode 先按 curl 的规矩做百分号编码(name= 只编等号右边,其余整串编码),另外三种都把取值原样放进 body,多次出现一律用 & 连接,没显式给方法就推断成 POST。真 curl 里最要紧的差别在 @ 前缀(-d @file 读文件、--data-raw 把 @ 当字面量、--data-binary @file 保留换行),而本工具一律不读盘,所以 --data-raw '@file.txt' 也会被拒;反过来 --data-urlencode 'name=@f.txt' 因为整体不以 @ 开头,会被当普通字符编成 name=%40f.txt。这两处是刻意保守与真实行为的偏差,规范化输出的 body 统一写成 --data-raw,因为那是「字面量」最准确的表达。

为什么生成的浏览器代码里有些头不见了?

浏览器把它们列成 forbidden header,脚本设置了也不会发出去,硬写进代码只会让人误以为生效:XHR 目标逐个核对 accept-encoding、accept-charset、cookie、set-cookie、content-length、host、origin、referer、user-agent、connection、date、dnt、expect、te、trailer、transfer-encoding、upgrade、via、proxy-connection,命中的行留在注释里并附说明;Cookie 改由 xhr.withCredentials = true 表达,-k 在浏览器里根本没有对应开关(证书有问题就是连接失败,没有代码可写)。Java 的 HttpClient 另有一份受限清单(connection、content-length、expect、host、upgrade),代理则是传输层的事:原生 fetch 不认 HTTPS_PROXY,要用 undici 的 ProxyAgent 或全局 dispatcher。

-u 翻出来的代码为什么每次都带 Authorization?

curl 的 -u 是挑战-响应流程:先发不带凭据的请求,收到 401 的 WWW-Authenticate 再决定用哪个方案重发。静态代码里没有这一轮往返,所以 axios 用 auth: { username, password } 字段、其余目标无条件写出 Authorization: Basic base64(user:pass),输出里附了这条差异说明。也正因如此,Digest、NTLM、Negotiate、aws-sigv4、OAuth2 被整体拒绝(需要状态机、系统凭据缓存或 token 端点),-c 的 cookie jar 同样拒绝——代码里的等价做法是自己接住 Set-Cookie,再在下一个请求里带上。

切词按什么规则?命令长度有上限吗?

先按 bash 的引用规则切词:单引号原样、双引号只解必要转义、$'…' 解控制字符、反斜杠与 cmd 的 ^ 续行都合并成一条命令、# 开头的注释行丢弃、带引号的 heredoc 整段收下并在遇到 -d @- 时回填成正文(不带引号的 heredoc 会提示变量展开)。命令长度上限 20000 字符。

curl → 代码的目标语言是哪几种?

curl → 代码有 9 个出口(curl 规范化、Node fetch、axios、Python requests、Go net/http、Java 11 HttpClient、浏览器 XHR、PowerShell、wget)。

对应功能编号 #114无需安装,手机端同样可用按 Ctrl + K 换工具