curl是一个用于通过各种网络协议传输数据的命令行工具。curl在所有主要操作系统上都可用,已成为从命令行发送HTTP请求的标准工具。
curl的跨平台实用程序支持HTTP、HTTPS、FTP和IMAP等协议,使得使用curl发送API请求和抓取网站变得很容易。由于其广泛的可用性和对多种协议的支持,你会经常在REST API文档中看到引用curl作为从命令行快速测试API调用的方法:
在本文中,你将学习如何使用curl从命令行发送POST请求。
什么是POST请求
POST请求是一种HTTP方法,用于向服务器发送数据,是最常见的HTTP方法之一。当你发送POST请求时,传输的数据包含在请求体中。这让你可以比使用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请求时指定多个选项。以下部分将展示一些常见的curl功能,这些功能在使用该工具发送POST请求时可能会用到。
指定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服务器知道你希望以何种格式接收响应也很重要。你可以使用Accept
头,并将其值设置为application/json
,让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数据。使用此标志,你可以简化发送JSON数据的POST请求命令:
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命令,该命令使用FormData包含FirstName和LastName字段发送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命令行工具发送POST请求。你学习了如何使用-X标志指定你要发送POST请求。你还使用-H
和--header
标志设置Content-Type
和Accept
头,以便Web服务器知道数据的格式。要在请求体中发送数据,你使用了-d标志以及你想发送的数据。
你还看到了几个示例,了解了如何发送多种类型的数据,包括JSON、XML和FormData
,并学习了如何在请求中使用-u
和--user
标志发送基本身份验证凭据。
虽然本文演示了curl中的基本标志及其用法,但curl还提供了更多功能,你可能想要探索,包括使用变量、发送带有请求的Cookie以及使用代理发送请求。许多编程语言还提供了库,让你可以从该编程语言中使用curl,包括Python、Node.js和Rust。
寻找抓取解决方案?立即注册并与我们的数据专家交谈,了解哪种产品最适合你的需求。