什么是 cURL?

了解 curl 的用法和优势。关键命令使 curl 成为处理 HTTP 请求和 API 测试的必备工具。
2 min read
什么是 cURL?

curl,全称“客户端 URL(client URL)”,是一种命令行工具,用于通过其 URL 向特定服务器传输数据。curl 具有高度的可访问性:它只需要一个命令行界面(CLI)和互联网连接,这使得它在路由器、打印机、汽车和医疗设备中被广泛使用。它甚至被用在火星上

对于大多数开发者来说,curl 是一个出色的工具,可以在任何操作系统上直接快速测试后端服务。

在本文中,您将了解更多关于 curl 以及如何使用它。

curl 的历史

curl 最初由巴西开发者 Rafael Sagula 于 1996 年创建和发布,Daniel Stenberg 在其首次发布后不久接手了该项目,进行了某些调整,使得 Stenberg 能够自动从网络上获取货币汇率。

鉴于其功能,curl 最初被命名为 httpget。当支持的协议数量增加时,名称改为 urlget。到 1998 年,当项目发展到足以支持上传功能时,最终命名为 curl。

它的增长并未止步于此。多年来,curl 发展到支持超过 25 种协议和多种功能,每月处理数亿次请求。如今,curl 是一个由全球志愿者社区维护的开源项目。

curl 的功能

curl 的命令行工具在开发者中以其执行快速 HTTP 请求的能力而闻名,使您的测试和调试任务更轻松。通过在计算机的终端中运行简单的命令,curl 可以执行 GET、POST 或指定 API 支持的其他 HTTP 请求。

虽然用户主要与 curl 的命令行工具交互,但最困难的部分是由其开发库 libcurl 处理的,这是一个支持大多数代码库的庞大库。作为 curl 项目的核心部分,它在幕后工作,处理请求和响应。

如何使用 curl

要使用 curl 命令行,您需要一个 CLI 来执行它们——macOS 的 Mac Terminal、Windows 的命令提示符或 Linux 的 Bash——以及一个互联网连接,以便您的机器可以完成它们、显示结果并在有响应时读取响应。

每个 curl 命令都遵循一个简单的语法:

curl [OPTIONS] [URL]

在这个结构中,[URL] 是您发送请求的终端点,而 [OPTIONS] 是确定您要进行的 HTTP 请求类型的命令。默认格式是一个破折号后跟一个字母(例如 -d),或者更详细的形式是双破折号后跟一个单词(例如 --data)。此外,您可以使用 -X [METHOD] 语法指定 HTTP 方法(例如 -X POST)。

以下是每个开发者都应了解的几个 curl 命令。

发送 GET 请求

最常见的 HTTP 请求形式是 GET 请求。它通常用于从指定地址检索数据——无论是文本、图像还是文件。curl GET 请求命令的默认语法是 curl [URL]。这里没有指定选项,因为 GET 是 curl 命令的默认行为。

使用示例 URL https://dummyjson.com/products,使用 curl 对该终端点执行的 GET 请求如下所示:

curl https://dummyjson.com/products

此命令的结果看起来像这样:

curl GET 请求的输出

然而,并非所有 GET 请求都如此容易执行。有些需要参数,虽然可以在 URL 中指定它们,但使用 curl 的适当语法更为方便。添加 -G 来指定 GET 请求,随后使用 -d "parameter1=value1" 来添加所需的参数数量。语法应如下所示:curl -G -d "parameter1=value1" -d "parameter2=value2" https://yoururl.com/yourendpoint

如果您向之前相同的 URL 发送 GET 请求,但将限制数量设置为仅 1,应如下所示:

curl -G -d "limit=1" https://dummyjson.com/products

curl 使用此命令通过基础 URL 和您设置的参数来形成完整的 URL https://dummyjson.com/products?limit=1,以发送 GET 请求。

输出将是:

带参数的 curl GET 请求输出

虽然 curl 功能强大,但它不会格式化从请求中收到的输出。在 Mac 上,您可以在命令行中添加 | json_pp 来美化响应:

curl GET 请求的美化输出

Windows 没有预装这样的工具,因此您需要安装类似 jq 的工具,并使用其快捷方式 | jq 来获得格式化良好的 JSON。

另外,请注意,您可以使用内置的编程语言来处理 curl 请求。例如,您可以在这篇 博客 中阅读有关使用 PHP 管理 GET 请求的更多信息。

发送 POST 请求

另一个常用的 HTTP 请求是 POST,它向服务器发送和更新数据。

使用 curl 发送 POST 请求的基本语法是 curl -X POST [URL]。这种类型的请求发送一个没有数据主体的 POST 请求,当请求仅用于更新数据库中某个项目的状态时,这可能很有用。例如,使用示例 URL https://httpbin.org/anything,您可以使用以下命令执行一个简单的 POST 请求:

curl -X POST https://httpbin.org/anything

在大多数情况下,您需要上传数据。为此,首先通过指定其格式来告诉 curl 如何读取您发送的数据主体。使用命令 -H 'HEADER: VALUE' 添加一个头部,然后使用数据命令 -d 'VALUE' 插入请求的主体。完整的语法是 curl -X POST -H 'HEADER: VALUE' -d 'VALUE' [URL]

如果您想发送一个包含名字和姓氏的 JSON 主体,您可以使用 Content-Type 将您的内容类型定义为 JSON 格式,并将一个简单的 JSON 定义为您的数据:

curl -X POST -H "Content-Type: application/json" -d "{
    "FirstName": "Joe",
    "LastName": "Soap"
}" https://httpbin.org/anything

以下是上述命令的输出:

curl POST 请求输出

如您所见,data 字段包含您在请求中发送的数据主体。

从 7.82 版本开始,curl 还引入了 --json 快捷方式,它将带有 JSON 主体的 POST 请求简化为 curl --json '[JSON BODY]' [URL]。使用 --json 快捷方式执行与之前相同的任务的命令如下:

curl --json '{"FirstName": "Joe", "LastName": "Soap"}' https://httpbin.org/anything

或者,如果您有一个较长的 JSON 主体,您希望将其保存为本地文件,您可以选择使用 curl --json @[FILENAME].txt [URL] 语法来上传它:

curl --json @file-name.txt https://httpbin.org/anything

您有多种将数据上传到服务器的选项。例如,您可能需要不同的格式,或者您可能想将文件上传到网络上。您可以在此处阅读有关使用 curl 发送 POST 请求的更多信息。

通过代理连接

许多开发者使用代理服务器来提高安全性。就像防火墙一样,可靠的代理服务器可以保护其用户及其网络免受互联网潜在威胁。它还提供了增强的隐私。

要正确使用代理服务器,您需要以下关于代理的信息:

  • 协议,例如 http://
  • 主机,通常是由点分隔的四个数字,例如 71.00.00.00
  • 端口,通常是一个四位数,例如 0000
  • 凭据(可选),形式为用户名和密码

您的代理 URL 的语法遵循方案 [PROTOCOL]://[[USERNAME]:[PASSWORD]][HOST]:[PORT],或者,如果代理不受凭据保护,则为 [PROTOCOL]://[HOST]:[PORT]

一旦您有了代理 URL,您可以使用命令 -x 在 curl 上设置它。注意,这与 -X 不同,后者指的是自定义 HTTP 请求方法。(请记住,curl 区分大小写。)如果您觉得更容易记忆,您也可以使用更详细的选项 --proxy。任一命令后都应跟随代理 URL 和最终的 URL。

考虑到上述要点,您设置代理 URL 的 curl 命令应类似于以下内容:

curl --proxy "http://71.00.00.00:0000" https://httpbin.org/ip

您的响应应包含一个 origin 对象,其值应对应于您的代理主机 IP 地址:

{

  "origin": "71.00.00.00"

}

这意味着网站认为请求来自您的代理的 IP 地址,而不是您的计算机。

有关如何使用 curl 与代理的更多信息,请查看此博客

使用头部信息

正如您可能已经注意到的那样,某些 HTTP 请求需要额外的信息才能正确完成任务。例如,您之前在 POST 请求中使用了 Content-Type 头部,以让 curl 知道如何读取您上传的数据主体。

头部信息,总是以命令 -H 开头,也可以在其他情况下使用。

一个常见的头部类型是 Authorization: Bearer [TOKEN],它指定了一个承载令牌以认证并访问受保护的 URL。另一个常用的头部是 Accept: application/json,它指定了对 JSON 响应的偏好。

如果您想接收某个 URL 的响应头部列表,您可以在终端中使用 -I curl 命令,如下所示:

curl -I https://dummyjson.com/products

您也可以使用 -i 来显示请求的响应以及头部信息。

您可以在这篇博客中阅读更多关于 curl 中头部的信息。

保存输出

有时,读取数据还不够,您需要将这些输出保存在计算机的某个位置。如前所述,curl 能够处理非文本形式的数据。例如,它可以下载或上传整个文件。

通过使用 -o 命令,您可以指定要保存的文件的名称和位置。例如,如果您想将此页面的内容以 TXT 格式保存到您的桌面,您可以使用以下命令:

curl -o /Users/User/Desktop/file.txt https://brightdata.com/blog

运行此命令并打开您的桌面,即可看到新保存的文件。

上传文件

正如 curl 能够从网络上下载文件一样,它也允许您上传文件。为了让 curl 知道您不是以文本形式上传数据,而是作为实际文件,您必须在文件名前加上符号 @

许多开发者犯了仅使用 -X POST 标志的错误,认为这是使用 curl 将文件上传到服务器的正确命令。然而,文件上传通常需要使用 multipart/form-data 内容类型,因为文件是作为表单的一部分附加的。因此,您需要设置正确的头部类型以及 -X POST 标志。-F 标志会自动设置正确的内容类型头部和 -X POST 标志——这为您提供了一个更短、更简单的命令。

使用 -F 标志,您可以通过指定表单字段的值来提交表单。要将文件作为表单字段附加,请在文件名前使用符号 @

正确的语法是 curl -F "file=@[FILE PATH]/[FILE NAME].txt" [URL],其中 file 是表单中文件字段的名称。例如,假设您想将之前下载的文件上传到一个像 https://example.com/upload 这样的虚拟 URL,您的命令应如下所示:

curl -F "file=@/Users/User/Desktop/file.txt" https://example.com/upload

如果您想上传多个文件,您可以在定义 URL 之前,多次重复 -F 命令语法。

curl 的使用场景

由于其高度的兼容性和多功能性,curl 可以用于各种不同的场景。

curl 最常见的用途是作为 HTTP 客户端进行 API 测试、与网络服务交互以及执行诸如 GET 或 POST 等不同的 HTTP 操作。许多编程语言也使用 libcurl 在内部执行 HTTP 请求。

虽然 curl 主要集中在执行 HTTP 请求并获取其响应,但它也可以与其他工具或脚本结合,用于解析和处理接收到的内容。例如,它可以获取网页的 HTML 内容,作为网页抓取的一部分。

curl 的优点

curl 提供了许多优点。最显著的是其高度的兼容性,使得几乎任何设备都可以使用,以及其简单易学的语法。

curl 还功能丰富、多才多艺、速度快,且特别轻量化,使其能够在不增加 CPU 负担的情况下执行任务。

结论

在本文中,您了解了更多关于 curl 的历史、其工作方式、使用场景和优点。您还看到了如何使用 curl 执行一些最基本的命令。

如果您对更快速的网页抓取方式感兴趣,请务必查看Bright Data 网页抓取器 API。立即注册,享受免费试用!