curl是一个命令行工具,允许在网络上传输数据。
它支持许多协议,包括HTTP、HTTPS、FTP、FTPS、SFTP、IMAP、SMTP、POP3等等。
当涉及到调试网络请求时,curl是你能找到的最好的工具之一。
它是那些一旦你知道如何使用就会一直使用的工具之一。一个程序员最好的朋友。
它是通用的,它可以在Linux、Mac、Windows上运行。请参考官方的安装指南,把它安装在你的系统上。
有趣的事实是:curl的作者和维护者swedish,因为他的工作(curl和libcurl)对计算机世界的贡献而被瑞典国王授予奖项。
让我们深入了解一些你在处理HTTP请求时最有可能要执行的命令和操作。
这些例子涉及到与HTTP这个最流行的协议的工作。
- 执行一个HTTP GET请求
- 获取HTTP响应头
- 只获取HTTP响应头
- 执行HTTP POST请求
- 执行HTTP POST请求,发送JSON
- 执行HTTP PUT请求
- 跟踪重定向
- 将响应存储到一个文件中
- 使用HTTP认证
- 设置一个不同的用户代理
- 检查请求和响应的所有细节
- 将任何浏览器的网络请求复制到curl命令中
执行一个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