cURL POST请求指南

了解cURL POST请求、它是什么、如何使用cURL发送POST请求等内容。
4 min read
cURL POST请求指南

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

你会注意到响应体中的datajson属性包含了你在请求中发送的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-TypeAccept头,并在请求体中发送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-TypeAccept头,以便Web服务器知道数据的格式。要在请求体中发送数据,你使用了-d标志以及你想发送的数据。

你还看到了几个示例,了解了如何发送多种类型的数据,包括JSON、XML和FormData,并学习了如何在请求中使用-u--user标志发送基本身份验证凭据。

虽然本文演示了curl中的基本标志及其用法,但curl还提供了更多功能,你可能想要探索,包括使用变量、发送带有请求的Cookie以及使用代理发送请求。许多编程语言还提供了库,让你可以从该编程语言中使用curl,包括PythonNode.jsRust

寻找抓取解决方案?立即注册并与我们的数据专家交谈,了解哪种产品最适合你的需求。