HTTP请求的curl指南

169 阅读4分钟

curl是一个命令行工具,允许在网络上传输数据。

它支持许多协议,包括HTTP、HTTPS、FTP、FTPS、SFTP、IMAP、SMTP、POP3等等。

当涉及到调试网络请求时,curl是你能找到的最好的工具之一。

它是那些一旦你知道如何使用就会一直使用的工具之一。一个程序员最好的朋友。

它是通用的,它可以在Linux、Mac、Windows上运行。请参考官方的安装指南,把它安装在你的系统上。

有趣的事实是:curl的作者和维护者swedish,因为他的工作(curl和libcurl)对计算机世界的贡献而被瑞典国王授予奖项。

让我们深入了解一些你在处理HTTP请求时最有可能要执行的命令和操作。

这些例子涉及到与HTTP这个最流行的协议的工作。

执行一个HTTP GET请求

当你执行一个请求时,curl会返回响应的主体。

curl https://flaviocopes.com/

获取HTTP响应头

默认情况下,响应头在curl的输出中是隐藏的。要显示它们,请使用i 选项。

curl -i https://flaviocopes.com/

只获取HTTP响应头

使用I 选项,你可以得到头信息,而不是响应正文。

curl -I https://flaviocopes.com/

执行一个HTTP POST请求

X 选项让你改变使用的HTTP方法。默认情况下,使用GET,它与写

curl -X GET https://flaviocopes.com/

使用-X POST 将执行一个POST请求。

你可以执行一个传递数据的URL编码的POST请求。

curl -d "option=value&something=anothervalue" -X POST https://flaviocopes.com/

在这种情况下,会发送application/x-www-form-urlencoded Content-Type。

执行一个HTTP POST请求,发送JSON

你可能想发送JSON,而不是像上面的例子那样以URL编码的方式发布数据。

在这种情况下,你需要明确设置Content-Type头,通过使用H 选项。

curl -d '{"option": "value", "something": "anothervalue"}' -H "Content-Type: application/json" -X POST https://flaviocopes.com/

你也可以从你的磁盘上发送一个JSON文件。

curl -d "@my-file.json" -X POST https://flaviocopes.com/

执行一个HTTP PUT请求

这个概念和POST请求是一样的,只需用以下方法改变HTTP方法即可-X PUT

遵循一个重定向

像301这样的重定向响应,指定了Location 响应头,可以通过指定L 选项自动跟随。

curl http://flaviocopes.com/

不会自动跟随到我设置的HTTPS版本的重定向,但这个会。

curl -L http://flaviocopes.com/

将响应存储到一个文件中

使用o 选项,你可以告诉curl把响应保存到一个文件中。

curl -o file.html https://flaviocopes.com/

你也可以直接用服务器上的文件名来保存文件,使用O 选项。

curl -O https://flaviocopes.com/index.html

使用HTTP认证

如果一个资源需要Basic HTTP认证,你可以使用u 选项来传递user:password值。

curl -u user:pass https://flaviocopes.com/

设置一个不同的用户代理

用户代理告诉服务器哪个客户端在执行请求。默认情况下,curl发送的是curl/<version> 用户代理,比如。curl/7.54.0.

你可以使用--user-agent 选项指定一个不同的用户代理。

curl --user-agent "my-user-agent" https://flaviocopes.com

检查请求和响应的所有细节

使用--verbose 选项可以使curl输出请求的所有细节,以及响应。

curl --verbose -I https://flaviocopes.com/
*   Trying 178.128.202.129...
* TCP_NODELAY set
* Connected to flaviocopes.com (178.128.202.129) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate: flaviocopes.com
* Server certificate: Let's Encrypt Authority X3
* Server certificate: DST Root CA X3
> HEAD / HTTP/1.1
> Host: flaviocopes.com
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Cache-Control: public, max-age=0, must-revalidate
Cache-Control: public, max-age=0, must-revalidate
< Content-Type: text/html; charset=UTF-8
Content-Type: text/html; charset=UTF-8
< Date: Mon, 30 Jul 2018 08:08:41 GMT
Date: Mon, 30 Jul 2018 08:08:41 GMT
...

将任何浏览器的网络请求复制到curl命令中

在使用Chrome开发工具检查任何网络请求时,您可以选择将该请求复制到curl请求中。

curl 'https://github.com/curl/curl' -H 'Connection: keep-alive' -H 'Pragma: no-cache' -H 'Cache-Control: no-cache' -H 'Upgrade-Insecure-Requests: 1' -H 'DNT: 1' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8' -H 'Referer: https://www.google.it/' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US,en;q=0.9,it;q=0.8' -H 'Cookie: _octo=GH1.1.933116459.1507545550; _ga=GA1.2.643383860.1507545550; tz=Europe%2FRome; user_session=XXXXX; __Host-user_session_same_site=YYYYYY; dotcom_user=flaviocopes; logged_in=yes; has_recent_activity=1; _gh_sess=ZZZZZZ' --compressed