核心要点:
- cURL GET 请求可帮助您通过命令行获取网页、API 数据或文件
- 查询参数可帮助您控制服务器返回的数据
- HTTP 请求头可帮助您指定想要的响应格式
要发起 cURL GET 请求,只需执行 cURL 命令并加上想要获取的资源的 URL 即可,无需添加 -X GET,因为 cURL 对 HTTP 和 HTTPS 请求默认使用 GET 方法
本文将帮助您理解如何发起这类请求、传递参数、添加 HTTP 请求头、处理 Cookie,以及将服务器响应保存到文件中,您还将学习如何排查常见错误,以及使用 cURL 时需要注意哪些安全风险。
cURL 如何使用 GET 方法获取数据
cURL 是众多命令行工具之一,您可以通过终端使用它与服务器交互并获取资源,GET 则是一种可用于向服务器请求资源的 HTTP 方法。
以下示例展示了 cURL 如何使用 GET 请求资源:
curl https://httpbin.org/get
那么,执行这条 cURL 命令后会发生什么呢?
- cURL 读取 URL,识别出您要连接的服务器以及目标资源
- cURL 随后将服务器的主机名解析为 IP 地址,并建立网络连接
- 由于该 URL 使用 HTTPS,cURL 会建立安全连接并验证服务器证书
- 接着 cURL 发送 GET 请求
- 服务器接收请求并决定返回的内容
- 服务器将 HTTP 响应发送回 cURL
- cURL 接收响应正文并在您的终端中显示
GET 请求不一定是获取文件,它只是向目标服务器请求该 URL 对应资源的当前表示形式,根据您请求的资源不同,服务器可能返回 HTML、JSON 或其他类型的数据。
常见使用场景
以下是 cURL GET 请求的一些常见使用场景:
- 获取网页内容:当您需要查看某个网页的服务器响应、而无需在浏览器中打开它时,cURL GET 请求会非常实用。
- 从 API 获取数据:使用 cURL 检查 API 端点是否正常工作、查看其返回的 JSON 数据,或测试查询参数。我们关于使用 cURL 发起 API 请求的指南涵盖了其他 HTTP 方法、身份验证以及更高级的 API 请求用法。
- 下载文件:cURL 可借助 -o 或 -O 等输出选项,将文件直接从远程服务器下载到本地设备。
无论哪种场景,cURL 都能让您直接从命令行发送 GET 请求并处理服务器的响应。
执行基本的 cURL GET 请求
以下示例展示了如何在终端中运行 cURL GET 请求。
获取网页内容
执行:
curl https://www.wikipedia.org
执行该命令后,cURL 会向维基百科发送 GET 请求,并将该网页的 HTML 源码返回到您的终端,它不会像浏览器那样渲染页面。
从公开 API 获取数据
您也可以向公开 API 发起 GET 请求,例如:
curl https://api.github.com/repos/curl/curl
这条 cURL 请求向 GitHub API 查询 curl/curl 仓库的信息,服务器返回的 JSON 数据中包含该仓库的详细信息。
测试 GET 请求
如果想要一条更便于查看的请求,可以执行:
curl https://httpbin.org/get
httpbin 专为测试 HTTP 请求而设计,该命令会返回 JSON 数据,展示其收到的这条 GET 请求的信息,包括请求头和 URL:
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/8.21.0",
"X-Amzn-Trace-Id": "Root=1-6a996f74-4245022838f60059124ef7b7"
},
"origin": "41.90.209.118",
"url": "https://httpbin.org/get"
}
以上命令都使用相同的基本 curl URL 命令格式,变化的只是您请求的资源以及服务器返回的响应内容。
当您需要让请求从其他 IP 地址发出时,也可以让 cURL GET 请求通过代理服务器转发,虽然可用的代理类型有很多,但住宅代理的效果较好,因为它们提供的 IP 地址来自真实的住宅网络连接。
请阅读我们关于在 cURL 中使用代理的文章,了解如何通过住宅 IP 转发 cURL GET 请求。
如何在 cURL GET 请求中传递参数
当目标服务器支持缩小范围、搜索、排序或以其他方式调整返回内容时,查询参数就非常有用。一个典型例子是使用 cURL 从 Open Library这类网站采集数据。
如果希望 cURL 请求搜索特定关键词并返回指定数量的结果,就需要在 URL 中添加查询参数。
可以使用以下命令:
curl "https://openlibrary.org/search.json?q=tolkien&limit=3"
这里引入了两个查询参数:
q=tolkien
这会告诉 Open Library 使用“tolkien”作为搜索关键词。
然后用 & 将该参数与第二个参数分隔开:
limit=3
这会告诉 Open Library 将结果数量限制为 3 条。
总的来说,查询参数可以让您控制 cURL 请求返回的结果,但如果想添加更多参数,手动编写完整的查询字符串很快就会变得繁琐。
好在 cURL 可以帮您自动构建查询字符串,您只需分别提供各个部分即可:
curl -G -d "q=tolkien" -d "limit=3" https://openlibrary.org/search.json
-G 会告诉 cURL 将提供的数据放入 URL 查询字符串并发送 GET 请求;接着 -d "q=tolkien" 提供搜索关键词,而 -d "limit=3" 则指定结果的最大数量。
cURL 会构建出:
?q=tolkien&limit=3
并将其附加到:
https://openlibrary.org/search.json
最终得到:
https://openlibrary.org/search.json?q=tolkien&limit=3
总而言之,-G 和 -d 选项只是一种更简便的方式,可确保参数在 cURL 中被正确编码,而无需手动构建整个查询字符串。
为 cURL GET 请求添加请求头
如果目标网站支持多种响应格式,您可以使用 HTTP 请求头告诉服务器您想要的格式;当目标服务器需要验证您是否有权访问某个资源时,请求头还可以携带身份验证信息。
例如,如果希望 cURL 以 JSON 格式接收数据,可以向服务器传递 Accept: application/json 这一 HTTP 请求头。
Open Library 在部分资源端点上支持此功能,例如:
curl -H "Accept: application/json" https://openlibrary.org/books/OL1M
这里的 -H 会告诉 cURL 在 GET 请求中添加一个 HTTP 请求头。请阅读我们关于使用 cURL 发送 HTTP 请求头的文章,了解更多关于身份验证、自定义 User-Agent 请求头及其他请求要求的技巧。
该请求头:
Accept: application/json
会告诉 Open Library,您希望服务器以 JSON 格式返回响应。
如果只需要响应头,可以使用 -I;对于 HTTP URL,这会让 cURL 发送 HEAD 请求,返回请求头而不包含常规的响应正文。
在 cURL GET 请求中处理 Cookie
在使用 cURL 时,Cookie 不会像浏览器那样在不同的 cURL 命令之间自动保留。例如,如果某网站在您登录后为您分配了一个会话 Cookie,后续的 cURL 请求并不会自动携带该 Cookie,由于没有任何关联,服务器可能会将第二次请求视为一次全新的会话。
您可以使用 -c 选项将服务器返回的 Cookie 保存到文件中;在后续请求中,使用 -b 加上包含 Cookie 的字符串或文件名,即可加载并发送这些 Cookie。
要在 httpbin 上查看其工作方式,首先请求 httpbin 设置一个 Cookie:
curl -c cookies.txt "https://httpbin.org/cookies/set?session=abc123"
/cookies/set 端点会发送一个名为 session、值为 abc123 的 Cookie,-c cookies.txt 选项会告诉 cURL 将该 Cookie 保存到名为 cookies.txt 的文件中。
然后,通过另一条 GET 请求将保存的 Cookie 发送回去:
curl -b cookies.txt https://httpbin.org/cookies
这里的 -b cookies.txt 会告诉 cURL 读取 cookies.txt 中保存的 Cookie,并发送其中适用于本次请求的部分,随后 httpbin 会展示它收到的 Cookie:
{
"cookies": {
"session": "abc123"
}
}
如果希望 cURL 既读取已有 Cookie,又保存服务器返回的更新内容,也可以对同一个文件同时使用 -b 和 -c:
curl -b cookies.txt -c cookies.txt https://example.com/account
如何将 cURL GET 请求的响应保存到文件
如果想保留服务器的响应以便日后查看,可以使用 -o 或 --output 选项将响应写入文件,而不是输出到标准输出(stdout,通常是您的终端)。
以下情况适合使用 -o 保存响应:
- 从 URL 下载文件
- 保留 API 输出以便日后查看
- 保存网页 HTML 以便比较或分析
- 保存数据供其他脚本或程序日后使用
- 避免在终端中显示大量响应内容
例如:
curl -o books.json "https://openlibrary.org/search.json?q=tolkien&limit=3"
这里的 -o books.json 会告诉 cURL 将响应正文保存到名为 books.json 的文件中,而不是显示在终端里,请注意选择文件名,因为 -o 可能会覆盖已存在的文件。
排查 cURL GET 请求的常见错误
从发送 cURL GET 请求到收到响应之间,会发生多个步骤:cURL 首先要查找服务器的 IP 地址、建立连接、为 HTTPS 建立安全连接、发送 GET 请求、等待服务器响应,最后接收响应。
这个过程中的任何一个环节都可能出现问题:
- 由于服务器响应时间过长,cURL 可能无法完成连接
- 请求可能失败,或返回意外的响应
- 服务器可能告诉 cURL 该资源位于另一个 URL
以下是针对这几种情况的排查方法:
如果服务器响应时间过长
如果 cURL 请求耗时过长,可以使用 --connect-timeout 或 --max-time 设置cURL 超时时间。
--connect-timeout 用于限制 cURL 等待建立连接的时长,例如:
curl --connect-timeout 2 httpbin.org
如果 cURL 在两秒内无法建立连接,就会停止。
要测试服务器响应缓慢的情况,可以使用 httpbin:
curl https://httpbin.org/delay/5
这会让服务器的响应延迟五秒。
您可以使用 --max-time 限制整个请求的耗时:
curl --max-time 2 https://httpbin.org/delay/5
如果请求耗时超过两秒,cURL 就会将其终止。
如果不知道问题出在哪里,该怎么办?
如果 cURL 的行为超出预期,或者显示了您看不懂的错误,可以使用 -v 选项(--verbose 的缩写)。这会显示 cURL 在请求过程中的具体操作,而不是只显示响应正文,您将看到以下内容:
- cURL 与服务器的连接方式
- HTTPS 的 TLS 及证书信息
- HTTP 请求头
- 服务器返回的响应头
如果服务器告知 cURL 该资源位于其他 URL
通常会通过3xx 重定向状态码看到这种情况,例如 301 Moved Permanently 或 307 Temporary Redirect。由于 cURL 默认不会跟随重定向,您需要使用 -L(--location 的缩写)来启用该功能:
curl -L https://example.com
加上 -L 后,cURL 会持续跟随重定向,直到到达最终 URL 或达到重定向次数上限。
使用 cURL 发送 GET 请求时的安全注意事项
以下是使用 cURL 发送 GET 请求时需要注意的几项安全事项。
使用 HTTPS 建立安全连接
只要目标服务器支持,就应在 cURL 请求中使用 HTTPS,因为 TLS 会对连接进行加密。如果使用 HTTP,请求或服务器响应就可能被他人窥探或篡改,在处理敏感数据时这会是个问题。
安全处理 API 密钥
即使目标服务器接受在 URL 中传递 API 密钥,只要 API 支持,最好还是通过 HTTP 请求头传递。虽然 HTTPS 会在传输过程中对查询字符串加密,但 URL 仍可能出现在您本不希望暴露密钥的地方,例如命令历史记录或服务器日志中。
因此,应将 API 密钥和持有者令牌(bearer token)放在请求头中传递:
curl -H "Authorization: Bearer YOUR_TOKEN" https://api.example.com/data
具体使用哪个 HTTP 请求头取决于所调用的 API。
验证 TLS 证书
通过 HTTPS 发送 cURL 请求时,cURL 默认会验证服务器的 TLS 证书。如果验证失败,cURL 会终止连接并报告错误。
如果您连接的内部服务器使用的证书并非 cURL 默认信任的证书,可以通过 --cacert 提供相应的 CA 证书:
curl --cacert company-ca.pem https://internal.example.com
您也可以使用 -k 或 --insecure 让 cURL 跳过证书验证:
curl -k https://internal.example.com
跳过验证会降低连接的安全性,因此 --insecure 通常仅应在测试或开发环境中使用。
结语
总的来说,cURL GET 请求可用于获取 HTML 页面内容、从 API 获取数据等多种使用场景。查询参数可用于指定所需数据,而请求头则可用于指定首选的响应格式或携带 API 密钥。
只需记住使用 HTTPS、不要将凭证放在 URL 中、并保持 TLS 证书验证开启。如需了解更多 cURL 使用技巧,欢迎加入我们的Discord 频道。