工具
指南

curl 转换器

开发

将 curl 命令实时转换为 JavaScript fetch、axios、Python、Go、Java 与 HTTPie,多语言 Tab 切换。

100% 客户端 无后端

不获取远程 URL;请直接粘贴你的 JSON。

输入
粘贴一条 curl 命令即可查看转换后的代码。
本页内容

什么是 curl 转换器?#

curl 可以说是 HTTP 世界里最接近「通用语」的工具。浏览器开发者工具的「Copy as cURL」、API 文档里的示例、提bug时贴出来的请求,最后落到你手里的几乎都是一条 curl 命令。但麻烦也在这里:你贴到的这条命令,往往不能直接塞进自己的代码。你的服务用 Python 写,或者用 Go,或者在前端用 fetch;你并不想在程序里去 shell out 调 curl,你想要的是「等价的调用」,用你已经在用的那个 HTTP 客户端写出来。

本页就是用来填这道缝的。把 curl 命令贴在左边,它会先把这条命令的 shell 语法——各种 flag、引号、续行、请求头、请求体、认证信息——解析成一个结构化的请求模型,再一次性输出成六种目标代码:浏览器 fetchaxios、Python requests、Go net/http、Java HttpURLConnection,以及 httpie。你在六个标签页之间横向对照,复制符合自己技术栈的那一份,然后继续干活。

整个解析过程完全在你的浏览器里完成。你贴进去的命令不会发往任何服务器——这一点很关键,因为真实的 curl 命令里常常带着 bearer token、basic-auth 凭据,或者签好的 cookie。

如何使用#

  1. 把 curl 命令贴进左侧的 输入 框。开头那个 curl 单词写不写都行,都能识别。跨行命令(用反斜杠 \ 续行)可以照贴,终端里每个 flag 单独一行的写法也能正常解析。
  2. 想先看看长什么样,点 示例(Sample)载入一条接近真实场景的命令;点 清空(Clear)可清空输入框。
  3. 在输出区上方的标签栏选择目标语言:fetchaxiospythongojavahttpie。六种代码是同一次解析的结果,切标签是瞬时完成的,不会重新跑一遍。
  4. 在面板里阅读生成的代码,点标签栏的 复制(Copy)取走。
  5. 留意两个输入框下方的状态栏。如果解析遇到了它不认识的 flag(比如输出重定向、代理设置),它会直接告诉你,而不是悄悄丢掉。

主要特性#

  • 真正的 shell 分词器,不是正则硬抠。 单引号、双引号、ANSI-C 风格的 $'...'(含 \n\t\x41é 等转义)、反斜杠续行,以及 "a\b"'a\b' 的区别,都按 bash 的规则处理。那种靠空白切分的简陋转换器,一旦遇到带空格的请求头值就会出错。
  • 一次解析出六份代码。 fetchaxios、Python、Go、Java、httpie 并排展示。如果你在 fetchaxios 之间犹豫,两下点击就能对比它们对同一个 auth 头的处理差异。
  • 对请求体有判断力。 当请求带 Content-Type: application/json 时,Python 输出会用 json= 关键字,保证 dict 形态的请求体被正确编码;其他情况下退回 data=
  • basic-auth 一次解码、各处到位。 -u user:pass 在 fetch 里变成 btoa("user:pass"),在 axios 里变成 auth 块,在 requests 里变成 auth= 元组,在 Go 里变成 SetBasicAuth——每种语言都按它自己的惯例来。
  • 不认识的 flag 会被报告,而非吞掉。 -o output.txt--proxy 这类会在状态栏里以 unknown args 形式列出,让你清楚知道某个重定向或代理是被有意识地略去,而不是丢失。
  • 无后端、不外泄。 命令由本页自己的脚本在内存里分词,没有任何携带你 token 外出的网络请求。

实战示例#

示例(或者直接贴一段等价于浏览器「Copy as cURL」的 JSON POST 命令):

curl -X POST https://example.com/api/v1/users \
  -H 'Authorization: Bearer tok' \
  -H 'Content-Type: application/json' \
  -d '{"name":"Alice","role":"admin"}'

切到 fetch 标签,得到:

const response = await fetch("https://example.com/api/v1/users", {
  method: "POST",
  headers: {
    "Authorization": "Bearer tok",
    "Content-Type": "application/json",
  },
  body: "{\"name\":\"Alice\",\"role\":\"admin\"}",
});

切到 python 标签。因为 Content-Type 是 JSON,请求体会走 json= 关键字:

import requests

url = 'https://example.com/api/v1/users'
headers = {
    'Authorization': 'Bearer tok',
    'Content-Type': 'application/json',
}
payload = '{"name":"Alice","role":"admin"}'
response = requests.request('POST', url, headers=headers, json=payload)
print(response.status_code)

同一条命令,在 gojavaaxioshttpie 标签下也都已经生成好了——一次粘贴,六份转换。

常见问题#

提示「unknown args」是什么意思,它漏掉了什么?#

解析器建模的是那些用来描述一个请求的 curl flag——方法、URL、请求头、请求体、basic-auth、--compressed-k-L。而用来描述 curl 自身行为的 flag(比如把响应体写入文件的 -o--proxy--connect-timeout--cert)不会被翻译,因为它们在 fetch 调用里根本没有对应物。这些 flag 会被收集起来显示在状态栏,让你明确知道它们是被有意略去的,而不是凭空消失。

支持 $'...' 这种 ANSI-C 引号的命令吗?#

支持。从终端复制出来的请求头或请求体有时会被包在 $'...' 里,以便让 \n\t 这类转义由 shell 解释。分词器理解 ANSI-C 引号,并会解码 \n\t\xHH\uHHHH\UHHHHHHHH 以及常见简单转义,因此转换器看到的字节和 curl 真正会发出去的字节是一致的。

为什么 Python 输出有时用 json=,有时用 data=#

取决于你的请求头。当存在 Content-Type: application/json 时,请求体会走 json= 关键字,由 requests 负责设置请求头并正确编码;对于其他内容类型(表单编码、纯文本、multipart),则退回 data=——因为强行套 json= 反而是错的。

它会替我真正发出这个请求吗?#

不会,这是有意为之。本工具只负责把命令翻译成代码,从不执行它。生成的代码片段要在你自己的程序里、用你自己的凭据运行,你可以在它真正打到线上之前先看一眼。