Linux - curl 命令


背景

  • 看到開發都是用這個命令來調接口,我也跟着用了
  • 的確很方便,有時候你要跟開發講某個接口可能有問題的時候,總不能每次都截圖吧,這樣可信力也不高
  • 所以寫 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        
}"

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM