cURL 是一個開源免費專案,主要是命令列工具 cURL 和 libcurl,cURL 可以處理任何網路傳輸協定,但是不涉及任何具體的數據處理。
cURL 支援的通訊協定非常豐富,如 DICT,FILE,FTP,FTPS,GOPHER,HTTP,HTTPS,IMAP,IMAPS,LDAP,LDAPS,MQTT,POP3,POP3S,RTMP, RTMPS,RTSP,SCP,SFTP,SMB,SMBS,SMTP,SMTPS,TELNET 以及 TFTP。檢視 cURL 原始碼可以存取官方 Github。
如果安裝 cURL 呢?
ubuntu / Debian.
sudo apt install curl
1
CentOS / Fedora.
sudo yum install curl
1
Windows.
如果你已經安裝了 Git,那麼 Git Bash 自帶 cURL . 如果作爲開發者你 git 都沒有,那麼只能官方手動下載。
$ curl http://wttr.in/
1
上面請求的範例網址是一個天氣網站,很有意思,會根據你的請求 ip 資訊返回你所在位置的天氣情況。
curl wttr.in
寫這篇文字時我所在的上海正在下雨,窗外飄雨無休無止。
$ curl -o readme.txt https://mirrors.nju.edu.cn/kali/README
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 159 100 159 0 0 1939 0 --:–:-- --:–:-- --:–:-- 1939
1
2
3
4
下載檔案會顯示下載狀態,如數據量大小、傳輸速度、剩餘時間等。可以使用 -s 參數禁用進度表。
$ curl -o readme.txt https://mirrors.nju.edu.cn/kali/README
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 159 100 159 0 0 1939 0 --:–:-- --:–:-- --:–:-- 1939
$
$ curl -o readme.txt https://mirrors.nju.edu.cn/kali/README -s
1
2
3
4
5
6
也可以使用 --process-bar 參數讓進度表顯示爲進度條。
$ curl -o readme.txt https://mirrors.nju.edu.cn/kali/README --progress-bar
########################################################################################## 100.0%
1
2
cURL 作爲強大的代名詞,斷點續傳自然手到擒來,使用 -C - 參數即可。下面 下麪是斷點續傳下載 ubuntu20.04 映象的例子。
$ curl -O https://mirrors.nju.edu.cn/ubuntu-releases/20.04/ubuntu-20.04-desktop-amd64.iso --progress-bar
^C
$ curl -C - -O https://mirrors.nju.edu.cn/ubuntu-releases/20.04/ubuntu-20.04-desktop-amd64.iso --progress-bar
^C
$ curl -C - -O https://mirrors.nju.edu.cn/ubuntu-releases/20.04/ubuntu-20.04-desktop-amd64.iso --progress-bar
^C
$
1
2
3
4
5
6
7
8
9
10
什麼?下載時不想佔用太多網速?使用 --limit-rate 限個速吧。
curl -C - -O https://mirrors.nju.edu.cn/ubuntu-releases/20.04/ubuntu-20.04-desktop-amd64.iso --limit-rate 100k
1
什麼?你又要從 FTP 伺服器下載檔案了?不慌。
curl -u user:password -O ftp://ftp_server/path/to/file/
1
3. Response Headers
使用 -i 參數顯示 Response Headers 資訊。使用 -I 可以只顯示 Response Headers 資訊。
$ curl -I http://wttr.in
HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sat, 30 May 2020 09:57:03 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 8678
Connection: keep-alive
Access-Control-Allow-Origin: *
1
2
3
4
5
6
7
8
4. 請求方式(GET/POST/…)
使用 -X 輕鬆更改請求方式。
$ curl -X GET http://wttr.in
$ curl -X POST http://wttr.in
$ curl -X PUT http://wttr.in
…
1
2
3
4
5. 請求參數
以傳入參數 name 值爲 未讀程式碼 爲例。https://www.szcbjs.com/
Get 方式參數直接url拼接參數。
$ curl -X GET http://wttr.in?name=未讀程式碼
1
Post 方式使用 --data 設定參數。
$ curl -X POST --data 「name=未讀程式碼」 http://wttr.in
1
請求時也可以自定義 header 參數,使用 --harder 新增。
$ curl --header 「Content-Type:application/json」 http://wttr.in
1
6. 檔案上傳
cURL 的強大遠不止此,表單提交,上傳檔案內容也不在話下,只需要使用 -F 或者 -D參數,-F 會自動加上請求頭 Content-Type: multipart/form-data ,而 -D 則是 Content-Type : application/x-www-form-urlencoded.
比如上傳一個 protrait.jpg 圖片。
$ curl -F [email protected] https://example.com/upload
1
提交一個具有 name 和 age 參數的 form 表單。
curl -F name=Darcy -F age=18 https://example.com/upload
1
參數對應的內容也可以從檔案中讀取。
curl -F 「content=<達西的身世.txt」 https://example.com/upload
1
上傳時同時指定內容型別。
curl -F 「content=<達西的身世.txt;type=text/html」 https://example.com/upload
1
上傳檔案的和其他參數一起。
curl -F ‘file=@「localfile」;filename=「nameinpost」’ example.com/upload
1
7. 網址通配
cURL 可以實現多個網址的匹配,你可以使用 {} 結合逗號分割來標識使用 url 中的某一段,也可以使用 [] 來表示範圍參數。
$ curl http://{www,pan,fanyi}.baidu.com
$ curl http://[1-10].baidu.com
$ curl http://[a-z].baidu.com
1
2
3
4
5
6
這種方式有時候還是很有用處的,比如說你發現了某個網站的 url 規律。
$ curl -c wdbyte_cookies http://www.wdbyte.com
$ curl -b wdbyte_cookes http://www.wdbyte.com
1
2
總結
以上就是 cURL 的常見用法了,最後告訴你一個小技巧,Chrome、Firefox 等瀏覽器可以直接拷貝請求爲 cURL 語句。儲存之後下次請求測試非常方便。
Chrome 複製 cURL 請求
參考資料
https://curl.haxx.se/docs/manpage.html
最後的話