Curl 使用指南
?點(diǎn)擊上方藍(lán)字關(guān)注我們,自我控制是最強(qiáng)者的本能

本文首發(fā)于【劉星的個(gè)人網(wǎng)站】
https://www.liuxing.io/blog/curl/
Curl 是一個(gè)常用的命令行數(shù)據(jù)傳輸工具,可以方便的從命令行創(chuàng)建網(wǎng)絡(luò)請(qǐng)求。它支持眾多協(xié)議,支持如 HTTP, HTTPS, FTP, FTPS, SFTP, IMAP, SMTP, POP3 等等協(xié)議。Curl 提供了很多強(qiáng)大的功能,我們可以利用它來(lái)進(jìn)行 HTTP 請(qǐng)求、上傳/下載文件等,且支持 Cookie、用戶(hù)密碼驗(yàn)證、代理隧道、限速等。
Curl 用于上傳和下載指定 URL 的數(shù)據(jù),它是一個(gè)客戶(hù)端(client-side)工具,一個(gè)客戶(hù)端 URL 工具。這也是它的名字的由來(lái)。
它是調(diào)試網(wǎng)絡(luò)請(qǐng)求的好工具,本文將介紹它的一些常用功能及參數(shù)。如果你的電腦還沒(méi)有安裝它,可以看看它的官方下載指引文檔:how to install curl
發(fā)起一個(gè) HTTP GET 請(qǐng)求
當(dāng)使用 curl 命令直接訪問(wèn)一個(gè)網(wǎng)址時(shí),將發(fā)起一個(gè) GET 請(qǐng)求,然后返回響應(yīng)體。
curl https://www.liuxing.io
在命令行運(yùn)行以上命令將返回,所訪問(wèn)liuxing.io頁(yè)面源碼。
重定向跟蹤 (-L)
當(dāng)請(qǐng)求一個(gè) URL 返回 301 之類(lèi)的重定向響應(yīng)時(shí),可以使用 -L 參數(shù)來(lái)自動(dòng)重定向跟蹤響應(yīng)頭里的Location時(shí)。
curl liuxing.io
在該網(wǎng)址設(shè)置了 301 重定向到 https 版 https://www.liuxing.io 。上面的示例不會(huì)自動(dòng)完成重定向追蹤。但我們可以使用以下命令:
curl -L liuxing.io
儲(chǔ)存響應(yīng)體到文件 (-O)
使用-o參數(shù)指定文件名,可以將響應(yīng)結(jié)果儲(chǔ)存到文件中
curl -o liuxing.io.html https://www.liuxing.io
還可以使用-O參數(shù)直接用服務(wù)器上的文件名保存在本地
curl -O https://www.liuxing.io/index.html
獲取 HTTP 響應(yīng)頭 (-i)
使用-i 參數(shù)可以參看請(qǐng)求 URL 的響應(yīng)頭。
curl -i https://www.liuxing.io
添加了-i參數(shù),URL 的響應(yīng)頭將與響應(yīng)體一起返回打印出來(lái)。
如果只想獲取響應(yīng)頭,可以使用-I參數(shù)。
curl -I https://www.liuxing.io
構(gòu)造 GET 查詢(xún)參數(shù) (-G)
在發(fā)起 GET 請(qǐng)求時(shí),可能我們需要在 URL 后面跟上查詢(xún)參數(shù),如 https://www.google.com/search?q=劉星的個(gè)人網(wǎng)站 。
可以通過(guò) -G 參數(shù)來(lái)構(gòu)造 URL 的查詢(xún)字符串
curl -G -d 'q=liuxing' https://www.google.com/search
上面的示例會(huì)將請(qǐng)求參數(shù)與請(qǐng)求 URL 拼接然后發(fā)出請(qǐng)求,請(qǐng)求地址為https://www.google.com/search?q=liuxing。注意:如果忘記了-G參數(shù),curl 會(huì)發(fā)出 POST 請(qǐng)求。
如果數(shù)據(jù)需要 URL 編碼,可以結(jié)合使用--data--urlencode參數(shù)。
curl -G --data-urlencode 'q=CURL 劉星的個(gè)人網(wǎng)站' https://www.google.com/search
改變 User Agent (-A)
User Agent 即用戶(hù)代理,簡(jiǎn)稱(chēng) UA,它使得服務(wù)器能夠識(shí)別客戶(hù)使用的操作系統(tǒng)及版本、CPU 類(lèi)型、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語(yǔ)言等。默認(rèn)情況下,curl 發(fā)送的 User Agent 為 curl/<version>,例如:curl/7.64.1。
可以使用-A指定 User Agent 為其他值。
curl -A 'my-user-agent' https://www.liuxing.io
如果你嘗試了請(qǐng)求前面的【構(gòu)造 GET 查詢(xún)參數(shù)】的示例,你會(huì)發(fā)現(xiàn) Google 拒絕了我們的請(qǐng)求?,F(xiàn)在加上一個(gè)瀏覽器的 User agent 請(qǐng)求一次就能得到正常返回結(jié)果。
curl -G --data-urlencode 'q=CURL 劉星的個(gè)人網(wǎng)站' -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參數(shù)用來(lái)設(shè)置 HTTP 請(qǐng)求頭的 Referer,表示請(qǐng)求的來(lái)源。
curl -e 'https://www.liuxing.io/blog/curl' https://www.liuxing.io
攜帶 Cookie 請(qǐng)求數(shù)據(jù) (-b)
使用 -b參數(shù)來(lái)向服務(wù)器發(fā)送 Cookie,可以直接接受 Cookie 字符串或者存儲(chǔ)了 Cookie 的文件。
curl -b 'foo=bar' https://www.liuxing.io
或者
curl -b ./cookies.txt https://www.liuxing.io
該命令會(huì)生成一個(gè)Cookie: foo=bar的 Cookie 請(qǐng)求頭發(fā)送給目標(biāo) URL。
使用-c參數(shù)可以將目標(biāo) URL 攜帶的 Cookie 寫(xiě)入到一個(gè)文件里。
curl -c cookies.txt https://www.liuxing.io
上面的命令可以將目標(biāo) URL https://www.liuxing.io 的 Cookie 保存到 cookies.txt 文件中
添加 HTTP 請(qǐng)求頭 (-H)
curl 可以通過(guò)-H key:value 的方式添加 HTTP 請(qǐng)求頭,要設(shè)置多個(gè)請(qǐng)求頭,可以通過(guò)添加多個(gè)-H參數(shù)實(shí)現(xiàn)。
curl -H 'Accept-Language: en-US' https://www.liuxing.io
前面介紹的 User agent 以及 Cookie 也是一個(gè)請(qǐng)求頭,也可以通過(guò)-H 的方式設(shè)置在請(qǐng)求頭中。
curl -H 'User-Agent: my-user-agent' https://www.liuxing.io
curl -H 'Cookie: foo=bar' https://www.liuxing.io
發(fā)送一個(gè) HTTP POST 請(qǐng)求
默認(rèn)情況下,curl 發(fā)送的是 GET 請(qǐng)求。要使其發(fā)送 POST 請(qǐng)求,需要使用-X POST命令行參數(shù)。
curl -X POST https://httpbin.org/post
更改 HTTP 請(qǐng)求方法 (-X)
-X 參數(shù)可以用來(lái)更改 HTTP 請(qǐng)求方法,-X POST 將發(fā)起 POST 請(qǐng)求,-X PUT 將發(fā)起 PUT 請(qǐng)求。
添加 POST 數(shù)據(jù)到請(qǐng)求中 (-d)
要將 POST 數(shù)據(jù)添加到請(qǐng)求中,需要使用-d參數(shù)。
使用-d參數(shù)后,HTTP 請(qǐng)求會(huì)自動(dòng)加上標(biāo)頭Content-Type : application/x-www-form-urlencoded。并且會(huì)自動(dòng)將請(qǐng)求轉(zhuǎn)為 POST 方法,因此可以省略-X POST。
curl -d'login=liuxing&password=123456' https://httpbin.org/post
發(fā)送 JSON 數(shù)據(jù)
現(xiàn)在 JSON 是非常流行的數(shù)據(jù)格式,當(dāng)發(fā)起請(qǐng)求時(shí),你可能希望發(fā)送 JSON 格式的數(shù)據(jù)。在這種情況下,需要使用-H參數(shù)來(lái)設(shè)置Content-Type請(qǐng)求頭。
curl -d '{"option": "value", "something": "anothervalue"}' -H "Content-Type: application/json" -X POST https://httpbin.org/post
還可以使用@直接讀取本地 JSON 文件的內(nèi)容,來(lái)發(fā)起請(qǐng)求
curl -d "@my-file.json" -X POST https://httpbin.org/post
HTTP 認(rèn)證 (-u)
如果目標(biāo) URL 需要 HTTP Basic Authentication,可以通過(guò)-u參數(shù)傳遞user:password來(lái)鑒權(quán)
curl -u user:pass http://httpbin.org/basic-auth/user/pass
打印請(qǐng)求的詳細(xì)日志 (-v)
使用 -v 參數(shù)可以打印出 curl 請(qǐng)求的所有請(qǐng)求與響應(yīng)詳細(xì)日志。它是--verbose 的簡(jiǎn)寫(xiě)。
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)
默認(rèn)情況下,curl 使用最大可用帶寬,但是通常我們需要放慢速度進(jìn)行測(cè)試??梢允褂?code style="overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(228, 105, 24);background-color: rgb(239, 239, 239);font-size: 0.875em;line-height: 1.6 !important;">--limit-rate 來(lái)限制 curl 的請(qǐng)求和響應(yīng)的帶寬,讓請(qǐng)求與響應(yīng)變慢。
curl --limit-rate 200k https://www.liuxing.io
上面的命令將 curl 限制在每秒 200K 字節(jié)。
參考鏈接
Everything curl https://everything.curl.de
Curl Cookbook https://catonmat.net/cookbooks/curl
往期精彩回顧:
RESTful API 設(shè)計(jì)最佳實(shí)踐
感謝閱讀,歡迎關(guān)注 ??
左手代碼右手磚,拋磚引玉
給贊,關(guān)注,在看
