cURL 已经在命令行 HTTP 客户端领域活跃了几十年。它被开发者和管理员广泛应用在各种 Web 开发场景中,比如测试 API、获取网页以及文件传输。在网页抓取中,我们主要使用 cURL 来测试 HTTP 请求。
REST(Representational State Transfer)是一种用于创建 API 的标准。在 REST API 中,服务器会配置来处理四种基本请求:GET
、POST
、PUT
和 DELETE
。这些方法都用于与 Web 服务器进行交互。我们会在本文中详细介绍它们。
开始使用
安装
如今 cURL 在大多数主流操作系统上都自带安装。它在 Linux 系统上已经存在很多年,macOS 和 Windows 现在也默认包含它。你可以使用以下命令来检查 cURL 是否已经安装。
curl --version
如果 cURL 安装正确,你会看到类似下面的输出。最重要的是,--version
命令应该会输出一个版本号。下方示例的版本号是 curl 7.81.0
。剩下的输出是版本和操作系统等具体信息。
curl 7.81.0 (x86_64-pc-linux-gnu) libcurl/7.81.0 OpenSSL/3.0.2 zlib/1.2.11 brotli/1.0.9 zstd/1.4.8 libidn2/2.3.2 libpsl/0.21.0 (+libidn2/2.3.2) libssh/0.9.6/openssl/zlib nghttp2/1.43.0 librtmp/2.3 OpenLDAP/2.5.18
Release-Date: 2022-01-05
Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets zstd
如果你的系统中没有安装 cURL,可以在他们的下载页面这里找到与你的操作系统匹配的版本。
<!–
- 如何安装 curl:简短说明,链接到对应操作系统的安装指南
–>
如何使用 cURL
发送 GET 请求
最常见的 HTTP 请求方式是 GET
请求。我们使用 GET
来“获取”信息。当你在浏览器中访问网页时,其实浏览器在底层使用的就是 GET
。在 cURL 中,可以使用 GET
标志来执行该请求。下面的示例向 https://jsonplaceholder.typicode.com/posts
发送一个 GET
请求。
curl -X GET https://jsonplaceholder.typicode.com/posts
执行该请求后,我们会“获取”文章列表作为响应。下面只展示了响应内容的一部分:
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
},
{
"userId": 1,
"id": 2,
"title": "qui est esse",
"body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
},
{
"userId": 1,
"id": 3,
"title": "ea molestias quasi exercitationem repellat qui ipsa sit aut",
"body": "et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut"
},
{
"userId": 1,
"id": 4,
"title": "eum et est occaecati",
"body": "ullam et saepe reiciendis voluptatem adipisci\nsit amet autem assumenda provident rerum culpa\nquis hic commodi nesciunt rem tenetur doloremque ipsam iure\nquis sunt voluptatem rerum illo velit"
},
{
"userId": 1,
"id": 5,
"title": "nesciunt quas odio",
"body": "repudiandae veniam quaerat sunt sed\nalias aut fugiat sit autem sed est\nvoluptatem omnis possimus esse voluptatibus quis\nest aut tenetur dolor neque"
},
<!–
- 什么是 GET 请求?
–>
发送 POST 请求
当我们想要向服务器发送信息并保存到数据库时,就会使用 POST
请求。最常见的例子就是在社交媒体上发表帖子。下面的示例通过 POST
创建一条新帖子:
curl -X POST https://jsonplaceholder.typicode.com/posts \
-H "Content-Type: application/json" \
-d '{
"title": "foo",
"body": "bar",
"userId": 1
}'
发送请求后,我们会收到包含该新帖子对象的响应:
{
"title": "foo",
"body": "bar",
"userId": 1,
"id": 101
}
如果你想了解更多关于如何发送更复杂的 POST
请求,可以参阅这篇指南。
发送 PUT 请求
正如你所了解到的,POST
请求通常用来在数据库中创建对象。有时我们想要修改数据库中已经存在的对象,这时就需要使用 PUT
请求。下面的示例将之前新帖子中的 body
从 bar
更新为 updated bar
。
curl -X PUT https://jsonplaceholder.typicode.com/posts/1 \
-H "Content-Type: application/json" \
-d '{
"id": 1,
"title": "foo",
"body": "updated bar",
"userId": 1
}'
执行后,你会收到下面的响应。可以看到,我们帖子的 body
已被更新。
{
"id": 1,
"title": "foo",
"body": "updated bar",
"userId": 1
}
发送 DELETE 请求
DELETE
请求的作用应该很直观了:它用于通过唯一标识符删除数据库中的对象。在这里,我们使用的标识符(id
)是 1
,也就是第一篇帖子。下面的代码会删除之前创建的帖子:
curl -X DELETE https://jsonplaceholder.typicode.com/posts/1
可以看到,响应只返回了一个空的 JSON 对象。这意味着这篇帖子已经被删除。
{}
在 cURL 中使用 Web Unlocker
当你将 cURL 与 Web Unlocker 结合使用时,你可以像单独使用 cURL 一样发起 HTTP 请求。然而,Web Unlocker 提供了代理的强大功能。
借助 Web Unlocker,你可以获得地理位置定位以及验证码(CAPTCHA)自动解决等功能,这些都来源于全球顶级的代理资源,而且这些代理都由平台替你管理。你只需要配置代理,就能像平时一样继续工作。
当你配置好 Web Unlocker 后,记得保存你的用户名、区域名(zone)和密码,它们用来验证你的连接。下面的示例中,我们设置了使用美国地区的代理:
curl -i --proxy brd.superproxy.io:33335 --proxy-user brd-customer-<YOUR_USERNAME>-zone-<YOUR_ZONE_NAME>-country-us:<YOUR_PASSWORD> -k "https://geo.brdtest.com/mygeo.json"
-i
:告诉 cURL 在响应中包含头部信息,这对调试非常有帮助。--proxy brd.superproxy.io:33335 --proxy-user brd-customer-<YOUR_USERNAME>-zone-<YOUR_ZONE_NAME>-country-us:<YOUR_PASSWORD>
--proxy brd.superproxy.io:33335
:告诉 cURL 使用位于brd.superproxy.io:33335
的代理。--proxy-user brd-customer-<YOUR_USERNAME>-zone-<YOUR_ZONE_NAME>-country-us:<YOUR_PASSWORD>
:这是我们的认证字符串。认证信息格式为:<用户名>:<密码>
。在使用 Web Unlocker 时,你的完整用户名包括:brd-customer-<YOUR_USERNAME>-zone-<YOUR_ZONE_NAME>-country-us
。
-k
用来告诉 cURL 我们要忽略 SSL 证书验证。如果你打算长期使用 Web Unlocker,你可以在这里下载并安装 SSL 证书,让你的机器自我验证连接。
下面是我们的示例响应。可以看到我们的地理位置显示在 New Jersey
(新泽西州)。
{"country":"US","asn":{"asnum":20473,"org_name":"AS-VULTR"},"geo":{"city":"Piscataway","region":"NJ","region_name":"New Jersey","postal_code":"08854","latitude":40.5511,"longitude":-74.4606,"tz":"America/New_York","lum_city":"piscataway","lum_region":"nj"}}
如果你想了解更多关于 Web Unlocker 的信息,可以查看我们的 API Playground。这是一个非常好的场所来尝试和学习如何用多种语言和 HTTP 库发起 API 请求。你也可以在这里了解更多关于在 cURL 中使用代理的内容。
从 cURL 开始,你能走多远?
一旦你对 cURL 和 HTTP 有了不错的理解,就可以在各种场景中使用 HTTP。你可以使用图形化界面(GUI)工具,比如Postman 和 Insomnia来做一般的 API 测试。
在 Python 中,你可以使用Requests,或者直接在 Python 中使用 cURL。在 JavaScript 中,可以使用Node-Fetch或者Axios 来自动化你的 HTTP 请求。
如果你更愿意继续使用命令行工具,还有很多其他选择。你可以看看 HTTPie 和wget。这两个工具也都非常优秀,在命令行中使用它们来处理 HTTP 十分方便。
结论
作为 HTTP 客户端,cURL 在命令行领域已经是数十年的标准,而且短期内不会改变。无论你是开发者还是系统管理员,现在你已经掌握了基本的 cURL 用法,以及对 HTTP 有了大致的理解。你甚至可以使用 cURL 下载文件,或自定义请求头。如今你也知道如何将它与 Web Unlocker 结合使用,那么无论你要处理什么工作,你都能有效地使用 HTTP。如果你是一位渴望成长的开发者,可以进一步学习如何在你所使用的语言中操作 HTTP。