背景
- 看到開發都是用這個命令來調接口,我也跟着用了
- 的確很方便,有時候你要跟開發講某個接口可能有問題的時候,總不能每次都截圖吧,這樣可信力也不高
- 所以寫 curl 調接口是最快的,直接讓開發復制粘貼執行一遍,就知道接口的確有問題了
curl 介紹
- curl 是常用的命令行工具,用來請求 Web 服務器
- 它的名字就是客戶端(client)的 URL 工具的意思
- 它的功能非常強大,命令行參數多達幾十種
- 如果熟練的話,完全可以取代 Postman 接口測試工具
官方文檔
https://curl.se/docs/manpage.html
支持的協議
- DICT、FILE、FTP、FTPS、GOPHER、HTTP、HTTPS
- IMAP、IMAPS、LDAP、LDAP、POP3、POP3、RTMP、RTSP、SCP、SFTP、SMB
- SMBS、SMTP、SMTPS、TELNET、TFTP
提供強大的功能
- 代理支持
- 用戶身份驗證
- FTP上傳
- httppost
- SSL連接
- cookies
- 文件傳輸恢復
- Metalink
- 等等
語法格式
curl [options / URLs]
URL 的各種傳法
僅做拓展,實際工作感覺不一定會用的上
大括號 { }
http://site.{1,2,3}.com
等價於發了請求了三個 host
http://site.1.com
http://site.2.com
http://site.3.com
中括號 [ ] 獲得字母數字序列
類似 range(1,100)
ftp://ftp.example.com/file[1-100].txt文件 # 100個請求
ftp://ftp.example.com/file[001-100].txt(帶0) # 100個請求
ftp://ftp.example.com/file[a-z].txt文件 # 26個請求
注意:不支持嵌套序列,但可以在每個序列旁邊使用多個嵌套序列
綜合使用
http://example.com/archive[1996-1999]/vol[1-4]/第{a,b,c}部分.html
[ ] 結合 步進
http://example.com/file[1-100:10].txt文件 # 每10個取一次,總共10個請求
http://example.com/file[a-z:2].txt文件 # 每2個取一次,總共13個請求
常見參數
不帶參數
請求網頁地址
https://www.cnblogs.com/poloyy/
返回的是網頁的 html 源碼
如果是一個正常的 get 請求
注意
后面的栗子,基本都會加 -v,是為了看請求的詳細過程,更容易看到對應的參數已生效,實際使用不需要每次都 -v
-A
- 等價參數: --user-agent <name>
- 作用:指定客戶端的 User-Agent
curl -v -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36" http://baidu.com
-b
- 等價參數: --cookie <data|file>
- 作用:向服務器發送 Cookie,可以是 data 也可以是一個文件
curl -v -b 'foo=bar' http://baidu.com
Request Headers 將會生成一個Cookie: foo=bar
,向服務器發送一個名為 foo
、值為 bar
的 Cookie
通過打印詳細信息,可以看到請求頭的確加了
-c
- 等價參數: --cookie-jar <filename>
- 作用:將服務器返回需要設置的 Cookie 寫入一個文件
curl -k -v -c test.txt https://www.baidu.com/s?wd=123%E8%89%BE%E5%BE%B7&rsv_spt=1&rsv_iqid=0xf0b9806f0000107b&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&rsv_sug3=6&rsv_sug1=2&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&inputT=1138&rsv_sug4=1138
會將百度響應需要設置的 Cookie 寫入 test.txt 文件
-d(常用)
- 等價參數: --data <data>
- 作用:用於發送 POST 請求的數據體
curl -v -d 'wd=biying' -d 'ie=UTF-8' https://www.baidu.com/s
- Http 請求頭會自動加上 Content-Type : application/x-www-form-urlencoded
- 並且會自動將請求轉為 POST 方法,因此可以省略
-X POST
--data-urlencode(常用)
作用:參數等同於 -d
,發送 POST 請求的數據體,但它會自動將發送的數據進行 URL 編碼
curl -v -G --data-urlencode 'wd=b i y i n g' -d 'ie=UTF-8' https://www.baidu.com/s
會將空格進行 URL 編碼
curl -v -G -d 'wd=b i y i n g' -d 'ie=UTF-8' https://www.baidu.com/s
-d 就不會 url 編碼
--data-raw(常用)
作用:POST 請求體,可以接收一個完整的 json 字符串
curl --location --request POST 'http://test.com/account.login?ver=1.0&df=json&cver=3.7.8&os=android' \
--header 'Content-Type: application/json' \
--data-raw '{
"id":"123",
"service":"account.login",
"client":{
"ve":"3.7.8",
"os":"android",
"si":"123",
"ex":{
"brand":"vivo",
"dpfr":"8.1.0",
},
"empty":false
},
"data":{
"ex":{
"token":"123"
}
}
}'
-e
- 價參數: --referer <URL>
- 作用:設置 HTTP Headers 里面的
Referer
,表示請求的來源
curl -v -e "test" http://baidu.com
-F
- 等價參數: --form <name=content>
- 作用:向服務器上傳二進制文件
curl -F 'file=@photo.png' https://google.com/profile
自動給 HTTP Request Headers 加上 Content-Type: multipart/form-data ,然后將文件 photo.png
作為 file
字段的值上傳
指定 MIME 類型
curl -F 'file=@photo.png;type=image/png' https://google.com/profile
指定 MIME 類型為 image/png ,否則 curl 會把 MIME 類型設為 application/octet-stream
指定文件名
curl -F 'file=@photo.png;filename=me.png' https://google.com/profile
服務器接收到的文件名為 me.png
-G
- 等價參數: --get
- 作用:構造 URL 的查詢字符串
curl -v -G -d 'wd=biying' -d 'ie=UTF-8' https://www.baidu.com/s
本來 -d 會讓 HTTP 請求變成 POST,但因為加了 -G,仍然是 GET,因為是查詢字符串
-H(常用)
- 等價參數: --header <header/@file>
- 作用:添加 HTTP 請求頭
curl -v -H "token:123" -H "Content-type:application/json" http://baidu.com
-H 指定兩個請求頭字段,都加上了
-i
- 等價參數: --include
- 作用:打印 Responses Headers 和響應內容
curl -i http://baidu.com
-I
- 等價參數: --head
- 作用:僅打印 Responses Headers
curl -I http://baidu.com
-k
- 等價參數: --insecure
- 作用:跳過 SSL 檢測
curl -k -I https://www.baidu.com
目測不加也能正常發起 HTTPS 的請求
-L
- 等價參數: --location
- 作用:讓 HTTP 請求跟隨服務器的重定向,curl 默認不跟隨重定向
curl -L -d 'tweet=hi' https://api.twitter.com/tweet
建議都加上
--limit-rate
作用:限制 HTTP 請求和回應的帶寬,模擬慢網速的環境
curl -v --limit-rate 2k http://baidu.com
將帶寬限制在每秒 2K 字節
但我測試了下,感覺比較雞肋,還是瞬間完成請求
-o
- 等價參數: --output <file>
- 作用:將服務器的 Responses 保存成文件,等同於
wget
命令
curl -o baidu.html http://baidu.com
-O
- 等價參數: --remote-name
- 作用:將服務器 Responses 保存成文件,並將 URL 的最后部分當作文件名
-s
- 等價參數: --silent
- 作用:靜默模式,將不輸出錯誤和進度信息,不發生錯誤的話,會正常顯示運行結果
-S
- 等價參數: --show-error
- 作用:只輸出錯誤信息,會讓 -s 參數不生效
常用組合技
curl -S -s https://google.com/login
如果正確,則正常輸出,如果錯誤則只輸出錯誤信息,不輸出運行結果
-u
- 等價參數: --user <user:password>
- 作用:設置服務器認證的用戶名和密碼
curl -u 'bob:12345' https://google.com/login
-v
- 等價參數: --verbose
- 作用:輸出通信的整個過程,用於調試
一路都是栗子,不再舉栗子
--trace
作用:輸出通信的整個過程,比 -v 更詳細
不舉栗子,因為是 16 進制的數據結果,直接看下面的 --trace-ascii,用法一樣,輸出的數據也一樣,但是是用 10 進制顯示
--trace-ascii
作用:輸出通信的整個過程,比 -v 更詳細,但沒有十六進制輸出,而是十進制
終極實際工作的栗子
為了更全面的看到請求的整個通信鏈路,直接用了我工作上一個接口,但我把敏感信息都換了,所以是請求不通的哈
curl --trace-ascii - --location --request POST 'http://test.com/account.login?ver=1.0&df=json&cver=3.7.8&os=android' \
--header 'Content-Type: application/json' \
--data-raw '{
"id":"123",
"service":"account.login",
"client":{
"ve":"3.7.8",
"os":"android",
"fr":"API Level-27",
"gameId":"100000",
"channelId":"100000",
"si":"123",
"ex":{
"brand":"vivo",
"dpfr":"8.1.0",
"imei":"123",
"imsi":"123",
"mac":"123",
"mf":"vivo",
"mobile":"",
"model":"123",
"net":"wifi",
"orient":"P",
"packageName":"123",
"resX":"1080",
"resY":"2034",
"subChannelId":"",
"utdid":"123",
"versionCode":"1",
"versionName":"3.7.8"
},
"empty":false
},
"data":{
"ex":{
"token":"123"
}
}
}'
請求部分
響應部分
可以說非常詳細了,連每個字段的字節大小都返回了
-w
- 等價參數: --write-out <format>
- 作用:完成請求后指定輸出格式
- 單獨的文章講解,比較多變量
https://www.cnblogs.com/poloyy/p/14877100.html
-X(常用)
- 等價參數: --request <command>
- 作用:指定 HTTP 請求的 Method
curl -v -X POST http://baidu.com
curl -v --request POST http://baidu.com
工作中常用模板
不一定完全萬能可用,根據自己需要進行修改
GET 請求
curl -L -S -s -K http://baidu.com
POST 請求
curl -L -S -s -K -X post \
-H "Content-type:application/json" \
-H ".." \
--data-raw "
{
"a":123,
"b:123
}"