curl 是一个使用各种网络协议传输数据的命令行工具。curl 可用于所有主要操作系统,已成为从命令行发送 HTTP 请求的标准工具。
curl 的跨平台实用程序支持 HTTP、HTTPS、FTP 和 IMAP 等协议,使向 API 发送请求和使用 curl 抓取网站变得容易。凭借其广泛可用性和对多种协议的支持,你经常会在 REST API 文档中看到 curl 被引用,作为一种直接从命令行快速测试 API 调用的方式:

在本文中,你将学习如何从命令行使用 curl 发送 POST 请求。
什么是 POST 请求
POST 请求是一种用于向服务器发送数据的 HTTP 方法,也是最常见的 HTTP 方法之一。
当你发送 POST 请求时,传输的数据包含在请求正文中。与在 URL 中发送数据(像使用 GET 请求那样)相比,这可以让你更谨慎地发送数据。你还可以在 POST 请求中发送明显更多的数据,从而规避浏览器对 GET 请求施加的 URL 长度限制。
你经常会看到 POST 请求用于提交表单、上传文件或向 API 发送 JSON 数据。与 GET 相比,POST 请求通常不会被缓存,并且由于请求数据位于请求正文中,数据不会显示在你的浏览器历史记录中。
如何使用 curl 发送 POST 请求
在开始本教程之前,你需要在计算机上安装 curl。运行以下命令检查是否已安装 curl:
curl --version
如果你收到错误提示说找不到该命令,则需要安装该实用程序。
安装 curl
以下是在所有主要操作系统上安装 curl 的说明:
Windows
在 Windows 上,你可以使用 Windows 11 中的默认包管理器 WinGet 来安装 curl:
winget install curl.curl
Chocolatey 是 Windows 的另一个包管理器,可让你使用以下命令安装 curl:
choco install curl
Linux
curl 可在大多数 Linux 包管理器中使用。在 Ubuntu/Debian 上,使用以下命令安装 curl:
apt-get install curl
Red Hat Enterprise Linux (RHEL)、CentOS 和 Fedora 可让你使用 Yellowdog Updater Modified (YUM) 安装 curl,如下所示:
yum install curl
如果你正在运行 OpenSUSE,可以使用以下终端命令安装 curl:
zypper install curl
最后,Arch Linux 可让你使用 pacman 通过此命令安装 curl:
pacman -Sy curl
macOS
Homebrew 是在 macOS 上安装 curl 的最简单方式。确保你已安装 Homebrew,然后运行以下命令:
brew install curl
现在你已经在操作系统上安装了 curl,可以开始学习如何发起 POST 请求了。
发起 POST 请求
curl 可让你在发送 POST 请求时指定多个选项。以下部分将展示在使用该实用程序发起 POST 请求时可能会遇到的一些常见 curl 功能。
指定 POST 方法
使用 curl 发起 HTTP 请求时,你需要指定要执行的 HTTP 方法。HTTP 方法包括 GET、POST、PUT 和 DELETE。curl 可让你使用 -X 命令行标志指定希望使用的 HTTP 方法。
例如,要向 https://httpbin.org/anything 发送 POST 请求,你可以在终端中执行以下 curl 命令:
curl -X POST https://httpbin.org/anything
httpbin.org 会在响应中回显请求正文和标头。你的响应应如下所示:
{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/8.1.2",
"X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
},
"json": null,
"method": "POST",
"origin": "0.0.0.0",
"url": "https://httpbin.org/anything"
}
-X POST 标志等同于使用 --request POST 标志,因此你也可以执行以下命令并获得相同结果:
curl --request POST https://httpbin.org/anything
响应看起来与前一个相同。
你可以在官方文档中阅读更多关于 -X 和 --request 标志的信息。
设置 Content-Type
发送 POST 请求时,指定你在请求正文中发送的内容类型非常重要,这样服务器才能正确解释请求正文。你可以在 HTTP 请求的 Content-Type 标头中使用 MIME 类型来指定请求正文格式。
例如,如果你在请求正文中发送 JSON,需要通过将 Content-Type 标头设置为 application/json 来告诉 Web 服务器预期 JSON 内容。如果你发送的是 XML,则你的 Content-Type 标头应为 application/xml。有关更多信息,请查看讨论 Content-Type 的官方文档。
curl 可让你使用 -H 标志为 HTTP 请求指定标头。举例来说,如果你在 POST 请求中发送 JSON,以下 curl 命令展示了如何为请求设置 Content-Type 标头:
curl -X POST -H 'Content-Type: application/json' -d '{}' https://httpbin.org/anything
在响应中,你可以看到 Content-Type 标头被设置为 application/json:
{
"args": {},
"data": "{}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Content-Length": "2",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/8.1.2",
"X-Amzn-Trace-Id": "Root=-11111111-111111111111111111111111"
},
"json": {},
"method": "POST",
"origin": "0.0.0.0",
"url": "https://httpbin.org/anything"
}
-H 标志也可以使用较长的 --header 标志来指定。在这种情况下,你的 curl 命令将如下所示:
curl -X POST --header 'Content-Type: application/json' -d '{}' https://httpbin.org/anything
你的响应将与前一个相同。
发送数据
你可能已经注意到前面的命令中有一个 -d 标志。此标志可让你指定要在请求正文中发送的数据。你可以使用该标志传递任何用引号括起来的值字符串,如下所示:
curl -X POST -H 'Content-Type: application/json' -d '{
"FirstName": "Joe",
"LastName": "Soap"
}' https://httpbin.org/anything
你会注意到 httpbin.org 在响应的 data 属性中显示了你发送的正文数据。
如果你有一个包含数据的文件,并希望 curl 在正文中发送它,请指定以 @ 字符为前缀的文件名。以下命令读取 body.json 的内容并通过请求正文发送:
curl -X POST -H 'Content-Type: application/json' -d @body.json https://httpbin.org/anything
在这种情况下,body.json 文件包含以下内容:
{
"FirstName": "Joe",
"LastName": "Soap"
}
发送此内容时,httpbin.org 应返回以下响应:
{
"args": {},
"data": "{t"FirstName": "Joe",t"LastName": "Soap"}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Content-Length": "41",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/8.1.2",
"X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
},
"json": {
"FirstName": "Joe",
"LastName": "Soap"
},
"method": "POST",
"origin": "0.0.0.0",
"url": "https://httpbin.org/anything"
}
--data 标志的行为与 -d 相同,因此你可以互换使用它们。
发送 JSON 数据
在上一节中,你看到了如何通过将 Content-Type 标头设置为 application/json,然后使用 -d 标志传入 JSON 数据来发送 JSON 数据。发送请求时,让 Web 服务器知道你期望以什么格式接收响应也很重要。你可以使用值为 application/json 的 Accept 标头,让 Web 服务器知道你希望接收 JSON 响应。
以下命令向服务器发送 JSON 请求,并让服务器知道你希望在响应中接收 JSON:
curl -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -d '{
"FirstName": "Joe",
"LastName": "Soap"
}' https://httpbin.org/anything
你会注意到响应正文中的 data 和 json 属性包含你在请求中发送的 JSON 数据:
{
"args": {},
"data": "{n "FirstName": "Joe",n "LastName": "Soap"n}",
"files": {},
"form": {},
"headers": {
"Accept": "application/json",
"Content-Length": "50",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/8.1.2",
"X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
},
"json": {
"FirstName": "Joe",
"LastName": "Soap"
},
"method": "POST",
"origin": "0.0.0.0",
"url": "https://httpbin.org/anything"
}
发送和接收 JSON 数据在发送 HTTP 请求时很常见,因此 curl 提供了一个 --json 标志,它会为你设置 Content-Type 和 Accept 标头,并在请求正文中发送 JSON 数据。使用此标志,你可以缩短命令,在 POST 请求中发送 JSON:
curl -X POST --json '{
"FirstName": "Joe",
"LastName": "Soap"
}' https://httpbin.org/anything
这会产生与之前相同的响应:
{
"args": {},
"data": "{n "FirstName": "Joe",n "LastName": "Soap"n}",
"files": {},
"form": {},
"headers": {
"Accept": "application/json",
"Content-Length": "50",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/8.1.2",
"X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
},
"json": {
"FirstName": "Joe",
"LastName": "Soap"
},
"method": "POST",
"origin": "0.0.0.0",
"url": "https://httpbin.org/anything"
}
--json 标志是在 2022 年 3 月的 curl 7.82 版本中发布的,因此在使用它之前,请确保你已安装最新版本的 curl。
发送 XML 数据
curl 还可让你发送其他格式的数据,例如 XML。要发送 XML 数据,你需要将 Content-Type 标头设置为 application/xml,并使用 -d 标志在请求正文中传递 XML 数据。你还可以通过将 Accept 标头设置为 application/xml 来告诉 Web 服务器你期望响应为 XML。
以下命令展示了如何使用 curl 在 POST 请求中发送 XML 对象:
curl -X POST -H 'Content-Type: application/xml' -H 'Accept: application/xml' -d '<Person>
<FirstName>Joe</FirstName>
<LastName>Soap</LastName>
</Person>' https://httpbin.org/anything
你会在 httpbin.org 返回的 data 属性中找到 XML 请求数据:
{
"args": {},
"data": "<Person>n <FirstName>Joe</FirstName>n <LastName>Soap</LastName>n</Person>",
"files": {},
"form": {},
"headers": {
"Accept": "application/xml",
"Content-Length": "79",
"Content-Type": "application/xml",
"Host": "httpbin.org",
"User-Agent": "curl/8.1.2",
"X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
},
"json": null,
"method": "POST",
"origin": "0.0.0.0",
"url": "https://httpbin.org/anything"
}
发送 FormData
你可以使用 FormData 向 Web 服务器发送数据的键值对。顾名思义,在网页上提交表单时会使用这种数据格式。键值对包含字段名和值。
curl 可让你使用 -F 或 --form 标志指定 FormData。使用该标志时,请按以下格式指定字段名和值:-F <name=content> 或 --form <name=content>。
下一个片段展示了一个 curl 命令,它使用带有 FirstName 和 LastName 字段的 FormData 发送 POST 请求:
curl -X POST -F FirstName=Joe -F LastName=Soap https://httpbin.org/anything
你会在 httpbin.org 响应对象的 form 属性中找到表单字段名和值:
{
"args": {},
"data": "",
"files": {},
"form": {
"FirstName": "Joe",
"LastName": "Soap"
},
"headers": {
"Accept": "*/*",
"Content-Length": "248",
"Content-Type": "multipart/form-data; boundary=------------------------e2bb56049a60b8b8",
"Host": "httpbin.org",
"User-Agent": "curl/8.1.2",
"X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
},
"json": null,
"method": "POST",
"origin": "0.0.0.0",
"url": "https://httpbin.org/anything"
}
对于要发送到服务器的每个字段,都要使用 -F 标志。
上传文件
你可以使用 FormData 通过将文件附加到字段来在 POST 请求中上传文件。要让 curl 知道某个 FormData 字段保存的是文件,请在字段值中输入文件路径,并以 @ 字符为前缀。
以下 curl 命令上传你工作目录中名为 Contract.pdf 的文件。该命令使用名为 File 的字段上传文件:
curl -X POST -F [email protected] https://httpbin.org/anything
响应包含整个文件,因此很长,但它应如下所示:
{
"args": {},
"data": "",
"files": {
"File": "..."
},
"form": {},
"headers": {
"Accept": "*/*",
"Content-Length": "246",
"Content-Type": "multipart/form-data; boundary=------------------------19ed1fc3be4d30c7",
"Host": "httpbin.org",
"User-Agent": "curl/8.1.2",
"X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
},
"json": null,
"method": "POST",
"origin": "0.0.0.0",
"url": "https://httpbin.org/anything"
}
发送凭据
许多 HTTP 端点需要身份验证才能发送请求。Web 服务器决定你应使用哪种身份验证方法。其中一种身份验证方法是基本身份验证方案,它可让你在请求中发送由用户名和密码组成的凭据。然后服务器验证凭据,如果正确,则处理请求。
curl 使用 -u 或 --user 标志简化了发送基本身份验证凭据的过程。然后你指定用户名和密码,并用 :(冒号)分隔它们,如下所示:-u <username:password>。
以下片段使用 curl 发送带有用户凭据和 JSON 正文的 POST 请求:
curl -X POST -u 'admin:password123' --json '{
"FirstName": "Joe",
"LastName": "Soap"
}' https://httpbin.org/anything
注意 curl 如何对用户名和密码进行编码,并在 Authorization 标头中发送它:
{
"args": {},
"data": "{n "FirstName": "Joe",n "LastName": "Soap"n}",
"files": {},
"form": {},
"headers": {
"Accept": "application/json",
"Authorization": "Basic YWRtaW46cGFzc3dvcmQxMjM=",
"Content-Length": "50",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/8.1.2",
"X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
},
"json": {
"FirstName": "Joe",
"LastName": "Soap"
},
"method": "POST",
"origin": "0.0.0.0",
"url": "https://httpbin.org/anything"
}
所有重要的 cURL 参数
| 参数 | 完整选项 | 简短描述 |
|---|---|---|
| -X | –request | 指定使用的 HTTP 方法 |
| -d | –data | 发送请求正文数据 |
| -F | –form | 发送基于表单的数据 |
| -H | –header | 设置请求标头字段 |
| -i | –include | 包含响应标头输出 |
| -v | –verbose | 显示额外的调试详细信息 |
| -L | –location | 自动跟随重定向 |
| -o | –output | 将响应写入文件 |
| -O | –remote-name | 保存为远程文件名 |
| -C | –continue-at | 从偏移位置恢复传输 |
| -u | –user | 设置基本身份验证凭据 |
| -x | –proxy | 使用指定的代理服务器 |
| -k | –insecure | 跳过 SSL 证书检查 |
| -I | –head | 仅获取标头 (HEAD) |
| -b | –cookie | 发送已存储的 cookie 数据 |
| -c | –cookie-jar | 将 cookie 写入文件 |
| -e | –referer | 设置 Referer 标头 |
| -A | –user-agent | 设置自定义 User-Agent |
| -m | –max-time | 最大请求时间限制 |
| –max-filesize | (无短格式) | 限制下载的文件大小 |
| -z | –time-cond | 如果自某时间后已修改则下载 |
| –compressed | (无短格式) | 请求压缩响应 |
| –data-urlencode | (无短格式) | 对数据字段进行 URL 编码 |
| –interface | (无短格式) | 绑定到特定接口 |
| -w | –write-out | 打印自定义响应信息 |
| -r | –range | 请求特定字节范围 |
| -s | –silent | 抑制进度输出 |
| -f | –fail | 出错时静默失败 |
| -g | –globoff | 禁用括号扩展 |
| –http1.0 | (无短格式) | 使用 HTTP/1.0 协议 |
| –http1.1 | (无短格式) | 使用 HTTP/1.1 协议 |
| –http2 | (无短格式) | 使用 HTTP/2 协议 |
| –http3 | (无短格式) | 使用 HTTP/3 协议 |
| -Z | –parallel | 同时发送请求 |
| –proxy-user | (无短格式) | 代理身份验证凭据 |
| –digest | (无短格式) | 使用 HTTP Digest 身份验证 |
| –ntlm | (无短格式) | 使用 HTTP NTLM 身份验证 |
| –negotiate | (无短格式) | 使用 SPNEGO/Kerberos 身份验证 |
结论
本文向你展示了如何使用 curl 命令行实用程序发送 POST 请求。你学习了如何使用 -X 标志指定要发送 POST 请求。你还使用 -H 和 --header 标志设置了 Content-Type 和 Accept 标头,以便 Web 服务器知道数据采用什么格式。要在请求正文中发送数据,你使用了 -d 标志以及你想要发送的数据。
你还看到了如何发送多种类型数据的几个示例,包括 JSON、XML 和 FormData,并学习了如何使用 -u 和 --user 标志在请求中发送基本身份验证凭据。
虽然本文演示了 curl 中包含的基本标志以及如何使用它们,但 curl 提供了更多你可能想要探索的功能,包括使用变量、随请求发送 cookie,以及使用代理发送请求。许多编程语言还提供了库,让你可以从该编程语言中使用 curl,包括 Python、Node.js 和 Rust。
正在寻找爬虫解决方案?立即注册并与我们的数据专家之一交流,看看我们的哪款产品最适合你的需求。