cURL 是 HTTP 请求的通用语言。每份 API 文档、每个关于 HTTP 调用的 Stack Overflow 答案,以及每次后端服务调试最终都会涉及 cURL 命令。本综合指南展示如何将 cURL 命令转换为 JavaScript(fetch 和 axios)、Python(requests 和 httpx)、Go、PHP、Ruby 和 Rust 的生产级代码。您将学习每个主要 cURL 标志及其在各编程语言中的等价物,如何处理包括 Bearer 令牌、Basic 认证和 API 密钥在内的身份验证模式,如何使用 multipart/form-data 上传文件,管理 cookies 和自定义头部,以及在 CI/CD 管道中自动化 cURL 转换。
TL;DR
- cURL 是 HTTP 请求的命令行工具。转换 cURL 到代码意味着将 -X、-H、-d、-u 和 -F 等标志映射到您的语言 HTTP 客户端。
- JavaScript:使用 fetch() 用于浏览器/Node.js 18+,或使用 axios 获得拦截器和自动 JSON 解析等更丰富的功能。
- Python:requests 库提供了从 cURL 最清晰的映射。httpx 添加了异步支持和 HTTP/2。
- Go、PHP、Ruby、Rust 都有标准库 HTTP 客户端。每种语言映射 cURL 标志的方式不同但遵循相同模式。
- API 密钥和令牌始终使用环境变量。绝不要在转换后的代码中硬编码密钥。
- 使用我们的免费在线 cURL 转代码转换器,从任何 cURL 命令即时生成生产级代码。
关键要点
- cURL 标志可预测地映射到 HTTP 客户端选项:-X 设置方法,-H 设置头部,-d 设置请求体,-u 设置 Basic 认证,-F 设置多部分表单数据。
- fetch() 是 JavaScript HTTP 请求的现代标准。axios 因其拦截器、自动转换和更清晰的错误处理仍然很受欢迎。
- Python requests 是简单性的黄金标准。httpx 扩展了异步/await 和 HTTP/2 支持。
- Go net/http 冗长但提供完全控制。PHP 有原生 curl 扩展和 Guzzle。Ruby 有 Net::HTTP 和 Faraday。Rust 使用 reqwest。
- 认证模式(Bearer、Basic、API 密钥)在所有语言中一致转换。始终将凭据存储在环境变量中。
- 多部分文件上传(-F 标志)在 JavaScript 中需要 FormData,Python 中使用 files 参数,Go 中使用 multipart.Writer,PHP 中使用 CURLFile。
- CI/CD 管道中的自动 cURL 转换有助于跨多语言代码库维护 API 客户端库和集成测试。
1. 什么是 cURL?为什么要转换为代码?
cURL(Client URL)是使用 URL 传输数据的命令行工具和库。它支持 HTTP、HTTPS、FTP 等 25 种以上协议,默认安装在 macOS、大多数 Linux 发行版和 Windows 10+ 上。
API 文档几乎总是以 cURL 格式提供示例,因为它与语言无关且被普遍理解。当您在终端中用 cURL 测试 API 端点并确认其工作后,下一步就是将该命令转换为您的应用程序编程语言。
将 cURL 转换为代码涉及将每个 cURL 标志和选项映射到目标语言 HTTP 客户端库中的等效构造。
这个转换过程虽然是机械性的,但手动操作时容易出错。遗漏头部、错误格式化请求体或不正确编码认证凭据会导致难以诊断的隐微错误。
2. cURL 标志参考:完整映射
理解 cURL 标志是准确转换的基础。以下是每个常用标志、它的作用以及如何映射到代码。
-X / --request
-X / --request:设置 HTTP 方法(GET、POST、PUT、PATCH、DELETE)。省略时默认为 GET。有 -d 且无 -X 时自动使用 POST。
-H / --header
-H / --header:添加请求头。可多次指定。格式:-H "Name: Value"。在代码中,头部通常收集到键值对象或映射中。
-d / --data
-d / --data:发送请求体数据。默认为 application/x-www-form-urlencoded。对于 JSON,始终配合 -H "Content-Type: application/json"。
--data-raw
--data-raw:与 -d 相同但不将 @ 解释为文件引用。
-F / --form
-F / --form:发送 multipart/form-data。用于文件上传。格式:-F "file=@/path/to/file"。
-u / --user
-u / --user:设置 Basic HTTP 认证。格式:-u username:password。
-b / --cookie
-b / --cookie:发送 cookies。格式:-b "name=value; name2=value2"。
-k / --insecure
-k / --insecure:跳过 TLS 证书验证。生产环境中绝不使用。
-L / --location
-L / --location:跟随 HTTP 重定向。大多数 HTTP 客户端库默认跟随重定向。
-o / --output
-o / --output:将响应体保存到文件。
-v / --verbose
-v / --verbose:显示详细的请求和响应信息。
--connect-timeout
--connect-timeout:等待连接建立的最大时间。
--max-time / -m
--max-time / -m:操作的最大总时间。
--compressed
--compressed:请求压缩响应并自动解压。
3. cURL 转 JavaScript(fetch 和 axios)
使用 fetch API
fetch API 是 JavaScript 中发起 HTTP 请求的现代标准,内置于所有现代浏览器、Node.js 18+、Deno 和 Bun。
带头部的简单 GET 请求:
const response = await fetch("https://api.example.com/users", {
headers: {
"Authorization": "Bearer " + process.env.API_TOKEN,
"Accept": "application/json"
}
});
const data = await response.json();带 JSON 请求体的 POST 请求:
const response = await fetch("https://api.example.com/users", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name: "John", email: "john@example.com" })
});
const data = await response.json();使用 multipart/form-data 上传文件:
const formData = new FormData();
formData.append("file", fileBlob, "photo.jpg");
formData.append("description", "Profile photo");
const response = await fetch("https://api.example.com/upload", {
method: "POST",
body: formData
});// Basic 认证
const credentials = btoa("user:password");
const response = await fetch("https://api.example.com/data", {
headers: { "Authorization": "Basic " + credentials }
});使用 axios
axios 是流行的 HTTP 客户端库,提供自动 JSON 解析、请求/响应拦截器和请求取消功能。
const { data } = await axios.get("https://api.example.com/users", {
headers: { "Authorization": "Bearer " + process.env.API_TOKEN }
});const { data } = await axios.post("https://api.example.com/users", {
name: "John", email: "john@example.com"
});const formData = new FormData();
formData.append("file", fs.createReadStream("photo.jpg"));
const { data } = await axios.post("https://api.example.com/upload", formData);const { data } = await axios.get("https://api.example.com/data", {
auth: { username: "user", password: "password" }
});4. cURL 转 Python(requests 和 httpx)
使用 requests 库
Python requests 是 Python 生态系统中最流行的 HTTP 客户端,其 API 几乎完美映射 cURL 标志。
import requests
import os
response = requests.get("https://api.example.com/users",
headers={"Authorization": f"Bearer {os.environ['API_TOKEN']}"})
data = response.json()response = requests.post("https://api.example.com/users",
json={"name": "John", "email": "john@example.com"})
data = response.json()with open("photo.jpg", "rb") as f:
response = requests.post("https://api.example.com/upload",
files={"file": ("photo.jpg", f, "image/jpeg")},
data={"desc": "Profile"})response = requests.get("https://api.example.com/data",
auth=("user", "password"))response = requests.get("https://api.example.com/me",
cookies={"session": "abc123", "theme": "dark"})使用 httpx(异步 + HTTP/2)
httpx 是下一代 Python HTTP 客户端,支持 async/await 和 HTTP/2。
import httpx
# 同步
response = httpx.get("https://api.example.com/users",
headers={"Authorization": "Bearer TOKEN"})
# 异步
async with httpx.AsyncClient() as client:
response = await client.get("https://api.example.com/users")5. cURL 转 Go
Go 标准库 net/http 包提供完整的 HTTP 客户端。代码较冗长但提供对请求生命周期的完全控制。
// GET with auth header
client := &http.Client{Timeout: 30 * time.Second}
req, _ := http.NewRequest("GET", "https://api.example.com/users", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("API_TOKEN"))
resp, _ := client.Do(req)// POST with JSON body
payload := strings.NewReader(`{"name":"John"}`)
req, _ := http.NewRequest("POST", "https://api.example.com/users", payload)
req.Header.Set("Content-Type", "application/json")
resp, _ := client.Do(req)// File upload
var buf bytes.Buffer
writer := multipart.NewWriter(&buf)
part, _ := writer.CreateFormFile("file", "photo.jpg")
file, _ := os.Open("photo.jpg")
io.Copy(part, file)
writer.Close()
req, _ := http.NewRequest("POST", url, &buf)
req.Header.Set("Content-Type", writer.FormDataContentType())// Basic auth
req, _ := http.NewRequest("GET", "https://api.example.com/data", nil)
req.SetBasicAuth("user", "password")6. cURL 转 PHP
PHP 内置 cURL 扩展,还有现代 Guzzle HTTP 客户端。
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.example.com/users");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer " . getenv("API_TOKEN")
]);
$response = curl_exec($ch);
curl_close($ch);$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://api.example.com/users"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(["name" => "John"])); curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type: application/json"]); $response = curl_exec($ch);
// Guzzle
$client = new Client(["base_uri" => "https://api.example.com"]);
$response = $client->post("/users", [
"json" => ["name" => "John"]
]);7. cURL 转 Ruby
Ruby 标准库提供 Net::HTTP,Faraday 是流行的第三方替代品。
require "net/http"
uri = URI("https://api.example.com/users")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer #{ENV['API_TOKEN']}"
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
response = http.request(req)req = Net::HTTP::Post.new(uri)
req["Content-Type"] = "application/json"
req.body = { name: "John" }.to_json
response = http.request(req)conn = Faraday.new(url: "https://api.example.com") do |f|
f.request :json
f.response :json
end
response = conn.get("/users") { |r| r.headers["Authorization"] = "Bearer TOKEN" }8. cURL 转 Rust
Rust 使用 reqwest crate 作为事实上的 HTTP 客户端,提供阻塞和异步 API。
let client = reqwest::Client::new();
let response = client
.get("https://api.example.com/users")
.header("Authorization", format!("Bearer {}", token))
.send()
.await?;let response = client
.post("https://api.example.com/users")
.json(&json!({"name": "John"}))
.send()
.await?;let form = reqwest::multipart::Form::new()
.part("file", part)
.text("description", "Profile photo");
let response = client.post(url).multipart(form).send().await?;9. 处理身份验证模式
身份验证是 cURL 转代码转换中最常见的方面之一。
Bearer 令牌(OAuth 2.0、JWT)
Bearer 令牌是现代 API 最常见的认证方法。在每种语言中都转换为设置 Authorization 头部。始终从环境变量加载令牌。
Basic 认证
Basic 认证将 username:password Base64 编码后放入 Authorization 头部。大多数 HTTP 客户端库提供专用的 auth 参数自动处理编码。
API 密钥认证
API 密钥可以通过头部、查询参数或请求体发送。
10. Multipart/Form-Data 和文件上传
文件上传在 cURL 中使用 -F 标志,发送 multipart/form-data。每种语言构建多部分请求体的方式不同。
关键点:不要手动设置 Content-Type 头部。HTTP 客户端必须自动设置以包含多部分边界字符串。
JavaScript 使用 FormData API,Python 使用 files 参数,Go 使用 multipart.Writer,PHP 使用 CURLFile。
11. 转换包含 Cookies 和头部的复杂 cURL
实际的 API 调用通常涉及多个头部、cookies 和复杂的请求体。
当 cURL 命令有多个 -H 标志时,将所有头部收集到单个对象中。-b 发送的 cookies 可以添加为 Cookie 头部或使用语言专用的 cookie 处理机制。
包含多个头部和 cookies 的复杂 cURL 命令:
curl -X PUT \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-H "X-Request-ID: req-123" \
-b "session=abc123; csrf=xyz789" \
-d '{"status":"active"}' \
https://api.example.com/users/42response = requests.put(
"https://api.example.com/users/42",
headers={"Authorization": "Bearer TOKEN", "X-Request-ID": "req-123"},
cookies={"session": "abc123", "csrf": "xyz789"},
json={"status": "active", "role": "admin"})const response = await fetch("https://api.example.com/users/42", {
method: "PUT",
headers: {
"Authorization": "Bearer TOKEN",
"Content-Type": "application/json",
"Cookie": "session=abc123; csrf=xyz789"
},
body: JSON.stringify({ status: "active", role: "admin" })
});12. 在 CI/CD 中自动化 cURL 转换
在多语言代码库和微服务架构中,跨多种语言维护 API 客户端代码是反复出现的挑战。
方法一:将规范的 cURL 命令存储在中央 API 规范文件中。在 CI 期间运行转换脚本为每种目标语言生成客户端代码。
方法二:使用 cURL 命令作为集成测试定义。将 API 测试编写为 cURL 命令,然后转换为特定语言的测试脚本。
方法三:从文档中的 cURL 示例生成 API 客户端库。
#!/bin/bash # 示例:在 CI 中将 cURL 转换为多种语言 for lang in javascript python go php ruby rust; do convert_curl_to_code "$CURL_CMD" --language "$lang" done
13. 何时使用 cURL vs 原生 HTTP 库
虽然 cURL 对于测试和原型设计非常有价值,但有些情况下应该直接使用原生 HTTP 库。
Use cURL
使用 cURL 的场景:从终端快速测试 API 端点。在文档中分享可复现的 API 示例。使用 -v 调试网络问题。
Use Native Libraries
使用原生 HTTP 库的场景:构建包含重试逻辑、断路器和连接池的生产 API 客户端。实现复杂的 OAuth 2.0 流程。处理流式响应。
理想的工作流程是:用 cURL 原型设计,用自动化工具转换为代码,然后增强生成的代码以适应生产环境。
14. 生产级 cURL 转代码最佳实践
将 cURL 转换为代码只是第一步。以下是生产级 API 客户端代码的基本最佳实践。
另请参阅:JSON Formatter
- 绝不硬编码密钥:使用环境变量替换 -u 凭据和 Authorization 令牌。
- 始终设置超时:防止请求挂起。
- 正确处理错误:检查 HTTP 状态码,实现指数退避重试。
- 显式设置 Content-Type:cURL -d 默认为 application/x-www-form-urlencoded。
- 生产环境使用 HTTPS:绝不将 -k 转换到生产代码中。
- 实现速率限制:尊重 Retry-After 头部。
- 添加请求日志:记录 URL、方法、状态码和持续时间。
- 使用连接池:重用 HTTP 客户端实例。
常见问题
如何将 cURL 命令转换为 JavaScript fetch?
将 cURL 标志映射到 fetch 选项:-X POST 变为 method: "POST",-H 变为 headers 对象条目,-d 变为 body 参数(JSON 使用 JSON.stringify()),-u user:pass 变为 Base64 编码的 Authorization: Basic 头部。使用我们的免费在线工具可以自动完成转换。
cURL 中 -d 和 -F 有什么区别?
-d 发送 application/x-www-form-urlencoded 或原始文本数据,用于 JSON 请求。-F 发送 multipart/form-data,用于文件上传。
如何在 Python 中处理 cURL 的 Basic 认证?
cURL 的 -u user:password 直接映射到 Python requests 的 auth 参数:requests.get(url, auth=("user", "password"))。库自动处理 Base64 编码。
能同时转换 cURL 到多种编程语言吗?
可以。我们的 DevToolBox cURL 转代码转换器支持 JavaScript、Python、Go、PHP、Ruby 和 Rust。粘贴您的 cURL 命令并选择目标语言即可。
如何将 cURL 文件上传命令转换为代码?
JavaScript 使用 FormData,Python 使用 files 参数,Go 使用 multipart.NewWriter,PHP 使用 CURLFile。每种语言自动处理多部分边界和 Content-Type 头部。
为什么转换后的代码返回与 cURL 不同的响应?
常见原因:缺少 Content-Type 头部、缺少 User-Agent 头部、重定向行为不同、TLS 问题。请比较 cURL -v 输出和您代码的请求。
转换 cURL 时如何处理 cookies?
Python 使用 cookies 参数,JavaScript fetch 添加 Cookie 头部,Go 创建 http.Cookie 对象。对于复杂的 cookie 管理,使用 cookie jar 或 session 对象。
将 cURL 命令粘贴到在线转换器安全吗?
对包含真实 API 密钥的 cURL 命令要谨慎。我们的 DevToolBox 转换器在浏览器端处理一切,数据不会离开您的机器。但分享前始终用占位符替换真实凭据。
总结
将 cURL 转换为代码是每个使用 API 的开发者的基本技能。通过理解 cURL 标志如何映射到各语言的 HTTP 客户端选项,您可以快速将任何 API 示例转换为生产级代码。
使用我们的免费工具将 cURL 命令转换为任何编程语言。