Curl 使用指南
☝点击上方蓝字关注我们,自我控制是最强者的本能
本文首发于【刘星的个人网站】
https://www.liuxing.io/blog/curl/
Curl 是一个常用的命令行数据传输工具,可以方便的从命令行创建网络请求。它支持众多协议,支持如 HTTP, HTTPS, FTP, FTPS, SFTP, IMAP, SMTP, POP3 等等协议。Curl 提供了很多强大的功能,我们可以利用它来进行 HTTP 请求、上传/下载文件等,且支持 Cookie、用户密码验证、代理隧道、限速等。
Curl 用于上传和下载指定 URL 的数据,它是一个客户端(client-side)工具,一个客户端 URL 工具。这也是它的名字的由来。
它是调试网络请求的好工具,本文将介绍它的一些常用功能及参数。如果你的电脑还没有安装它,可以看看它的官方下载指引文档:how to install curl
发起一个 HTTP GET 请求
当使用 curl 命令直接访问一个网址时,将发起一个 GET 请求,然后返回响应体。
curl https://www.liuxing.io
在命令行运行以上命令将返回,所访问liuxing.io页面源码。
重定向跟踪 (-L)
当请求一个 URL 返回 301 之类的重定向响应时,可以使用 -L
参数来自动重定向跟踪响应头里的Location
时。
curl liuxing.io
在该网址设置了 301 重定向到 https 版 https://www.liuxing.io 。上面的示例不会自动完成重定向追踪。但我们可以使用以下命令:
curl -L liuxing.io
储存响应体到文件 (-O)
使用-o
参数指定文件名,可以将响应结果储存到文件中
curl -o liuxing.io.html https://www.liuxing.io
还可以使用-O
参数直接用服务器上的文件名保存在本地
curl -O https://www.liuxing.io/index.html
获取 HTTP 响应头 (-i)
使用-i
参数可以参看请求 URL 的响应头。
curl -i https://www.liuxing.io
添加了-i
参数,URL 的响应头将与响应体一起返回打印出来。
如果只想获取响应头,可以使用-I
参数。
curl -I https://www.liuxing.io
构造 GET 查询参数 (-G)
在发起 GET 请求时,可能我们需要在 URL 后面跟上查询参数,如 https://www.google.com/search?q=刘星的个人网站
。
可以通过 -G
参数来构造 URL 的查询字符串
curl -G -d 'q=liuxing' https://www.google.com/search
上面的示例会将请求参数与请求 URL 拼接然后发出请求,请求地址为https://www.google.com/search?q=liuxing
。注意:如果忘记了-G
参数,curl 会发出 POST 请求。
如果数据需要 URL 编码,可以结合使用--data--urlencode
参数。
curl -G --data-urlencode 'q=CURL 刘星的个人网站' https://www.google.com/search
改变 User Agent (-A)
User Agent 即用户代理,简称 UA,它使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言等。默认情况下,curl 发送的 User Agent 为 curl/<version>
,例如:curl/7.64.1。
可以使用-A
指定 User Agent 为其他值。
curl -A 'my-user-agent' https://www.liuxing.io
如果你尝试了请求前面的【构造 GET 查询参数】的示例,你会发现 Google 拒绝了我们的请求。现在加上一个浏览器的 User agent 请求一次就能得到正常返回结果。
curl -G --data-urlencode 'q=CURL 刘星的个人网站' -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36" https://www.google.com/search
添加 Referrer (-e)
使用 -e
参数用来设置 HTTP 请求头的 Referer
,表示请求的来源。
curl -e 'https://www.liuxing.io/blog/curl' https://www.liuxing.io
携带 Cookie 请求数据 (-b)
使用 -b
参数来向服务器发送 Cookie,可以直接接受 Cookie 字符串或者存储了 Cookie 的文件。
curl -b 'foo=bar' https://www.liuxing.io
或者
curl -b ./cookies.txt https://www.liuxing.io
该命令会生成一个Cookie: foo=bar
的 Cookie 请求头发送给目标 URL。
使用-c
参数可以将目标 URL 携带的 Cookie 写入到一个文件里。
curl -c cookies.txt https://www.liuxing.io
上面的命令可以将目标 URL https://www.liuxing.io 的 Cookie 保存到 cookies.txt 文件中
添加 HTTP 请求头 (-H)
curl 可以通过-H key:value
的方式添加 HTTP 请求头,要设置多个请求头,可以通过添加多个-H
参数实现。
curl -H 'Accept-Language: en-US' https://www.liuxing.io
前面介绍的 User agent 以及 Cookie 也是一个请求头,也可以通过-H 的方式设置在请求头中。
curl -H 'User-Agent: my-user-agent' https://www.liuxing.io
curl -H 'Cookie: foo=bar' https://www.liuxing.io
发送一个 HTTP POST 请求
默认情况下,curl 发送的是 GET 请求。要使其发送 POST 请求,需要使用-X POST
命令行参数。
curl -X POST https://httpbin.org/post
更改 HTTP 请求方法 (-X)
-X
参数可以用来更改 HTTP 请求方法,-X POST
将发起 POST 请求,-X PUT
将发起 PUT 请求。
添加 POST 数据到请求中 (-d)
要将 POST 数据添加到请求中,需要使用-d
参数。
使用-d
参数后,HTTP 请求会自动加上标头Content-Type : application/x-www-form-urlencoded
。并且会自动将请求转为 POST 方法,因此可以省略-X POST
。
curl -d'login=liuxing&password=123456' https://httpbin.org/post
发送 JSON 数据
现在 JSON 是非常流行的数据格式,当发起请求时,你可能希望发送 JSON 格式的数据。在这种情况下,需要使用-H
参数来设置Content-Type
请求头。
curl -d '{"option": "value", "something": "anothervalue"}' -H "Content-Type: application/json" -X POST https://httpbin.org/post
还可以使用@
直接读取本地 JSON 文件的内容,来发起请求
curl -d "@my-file.json" -X POST https://httpbin.org/post
HTTP 认证 (-u)
如果目标 URL 需要 HTTP Basic Authentication,可以通过-u
参数传递user:password
来鉴权
curl -u user:pass http://httpbin.org/basic-auth/user/pass
打印请求的详细日志 (-v)
使用 -v
参数可以打印出 curl 请求的所有请求与响应详细日志。它是--verbose
的简写。
curl -v -I https://www.liuxing.io
输出为:
$ curl --verbose -I https://www.liuxing.io
* Trying 104.21.80.225...
* TCP_NODELAY set
* Trying 2606:4700:3036::ac43:9a86...
* TCP_NODELAY set
* Connected to www.liuxing.io (104.21.80.225) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/cert.pem
CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1)
...
限制 HTTP 带宽 (--limit-rate)
默认情况下,curl 使用最大可用带宽,但是通常我们需要放慢速度进行测试。可以使用--limit-rate
来限制 curl 的请求和响应的带宽,让请求与响应变慢。
curl --limit-rate 200k https://www.liuxing.io
上面的命令将 curl 限制在每秒 200K 字节。
参考链接
Everything curl https://everything.curl.de
Curl Cookbook https://catonmat.net/cookbooks/curl
往期精彩回顾:
感谢阅读,欢迎关注 😃
左手代码右手砖,抛砖引玉
给赞,关注,在看