認識 cURL
“A command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET and TFTP. libcurl offers a myriad of powerful features
”
curl 是常用的開源命令行工具,用來請求 Web 服務器。它的名字就是客戶端(client)的 URL 工具的意思。它的功能非常強大,命令行參數多達幾十種。它支持包括 FTP、HTTP、HTTPS、FTP、SCP,SFTP 數十種協議。如能熟練使用,可以在很多應用場景下,發揮巨大的價值。
cURL 的使用
代替 Postman ?
curlhttps://www.baidu.com
如上命令,不帶有任何參數時,curl 就是發出 GET 請求,服務器返回的內容會在命令行輸出。當然,你還可以為其添加各種參數(如 -A、-b、-c、-d、-e、-F、-H 等等),使得可以完成更多復雜任務;
其實,如果只是簡單的 Post、Get 請求,用 cURL 做像接口測試的工作是非常方便的。
有人說了,Postman 它不香嗎?
是的,挺香的,但是當你在環境受限的情況下,比如 在 linux 服務器上想測試一下接口通不通沒有 Postman 怎么辦?
這時候 cURL 就體現出它的價值了。此外貼心的 Postman,還為我們提供了各種語言和 cURL 的 snippet,方便你在 Postman 編輯完成后直接拿走開發和調試使用。
如上圖,你直接 copy 內容,然后在命令行執行就可以了。
小工具了解一下
jsonplaceholder http://jsonplaceholder.typicode.com/
免費的 HTTP 請求假數據接口,前端同學可以了解一下
- 不需引入外部 js 文件。
- 同時支持 http 和 https 請求。
- 同時支持 post 請求和 get 請求。
看看 cookie?
curl-bcookies.txthttps://www.youku.com
上面命令將服務器的 HTTP 回應所設置 Cookie 寫入文本文件 cookies.txt。
上傳個文件?
網站中上傳文件功能很普遍,然而你是怎么調試的呢?
打開頁面,選擇文件后再點擊上傳按鈕?然后 F12 看看 Request、Response? 或者打開 Postman 進行類似步驟?
可真夠麻煩的。用 cURL 一行命令搞定
這里先介紹一下 -v 參數:
“使用 -v 參數使 curl 打印有關請求和響應的詳細信息。以 > 為前綴的行是發送給服務器的數據,以 < 為前綴的行是從服務器接收的數據,以 * 開頭的行是雜項信息,如連接信息、SSL 握手信息、協議信息等。
”
我們看個例子,搞下百度:
?curl-vhttps://www.baidu.com
*Trying110.242.68.3:443...
*Connectedtowww.baidu.com(110.242.68.3)port443(#0)
*ALPN:offersh2
*ALPN:offershttp/1.1
*TLSv1.3(OUT),TLShandshake,Clienthello(1):
*TLSv1.3(IN),TLShandshake,Serverhello(2):
*TLSv1.2(IN),TLShandshake,Certificate(11):
*TLSv1.2(IN),TLShandshake,Serverkeyexchange(12):
*TLSv1.2(IN),TLShandshake,Serverfinished(14):
*TLSv1.2(OUT),TLShandshake,Clientkeyexchange(16):
*TLSv1.2(OUT),TLSchangecipher,Changecipherspec(1):
*TLSv1.2(OUT),TLShandshake,Finished(20):
*TLSv1.2(IN),TLShandshake,Finished(20):
*SSLconnectionusingTLSv1.2/ECDHE-RSA-AES128-GCM-SHA256
*ALPN:serveracceptedhttp/1.1
*Servercertificate:
*subject:C=CN;ST=beijing;L=beijing;OU=serviceoperationdepartment;O=BeijingBaiduNetcomScienceTechnologyCo.,Ltd;CN=baidu.com
*startdate:Jul505022022GMT
*expiredate:Aug605012023GMT
*subjectAltName:host"www.baidu.com"matchedcert's"*.baidu.com"
*issuer:C=BE;O=GlobalSignnv-sa;CN=GlobalSignRSAOVSSLCA2018
*SSLcertificateverifyok.
>GET/HTTP/1.1
>Host:www.baidu.com
>User-Agent:curl/7.83.1
>Accept:*/*
>
*Markbundleasnotsupportingmultiuse
百度一下,你就知道
*Connection#0tohostwww.baidu.comleftintact
可以看到,包括握手過程、請求、響應信息一應俱全。
加 -v 參數的作用就是就是為了跟蹤(trace)一下請求,看看具體細節,這跟你 F12 的目的是一樣的。此外,如果你想看到具體的請求、響應時間點可以加入 --trace-time 參數,最后的命令如下:
curl-v--trace-timehttps://www.baidu.com
效果是這樣的:
?curl-v--trace-timehttps://www.baidu.com
1850.680025*Trying110.242.68.4:443...
1850.692744*Connectedtowww.baidu.com(110.242.68.4)port443(#0)
1850.693142*ALPN:offersh2
1850.693165*ALPN:offershttp/1.1
1850.706507*TLSv1.3(OUT),TLShandshake,Clienthello(1):
1850.723346*TLSv1.3(IN),TLShandshake,Serverhello(2):
1850.723509*TLSv1.2(IN),TLShandshake,Certificate(11):
1850.724242*TLSv1.2(IN),TLShandshake,Serverkeyexchange(12):
1850.724370*TLSv1.2(IN),TLShandshake,Serverfinished(14):
1850.724572*TLSv1.2(OUT),TLShandshake,Clientkeyexchange(16):
1850.724628*TLSv1.2(OUT),TLSchangecipher,Changecipherspec(1):
1850.724727*TLSv1.2(OUT),TLShandshake,Finished(20):
1850.740045*TLSv1.2(IN),TLShandshake,Finished(20):
1850.740086*SSLconnectionusingTLSv1.2/ECDHE-RSA-AES128-GCM-SHA256
1850.740105*ALPN:serveracceptedhttp/1.1
1850.740129*Servercertificate:
1850.740160*subject:C=CN;ST=beijing;L=beijing;OU=serviceoperationdepartment;O=BeijingBaiduNetcomScienceTechnologyCo.,Ltd;CN=baidu.com
1850.740182*startdate:Jul505022022GMT
1850.740200*expiredate:Aug605012023GMT
1850.740256*subjectAltName:host"www.baidu.com"matchedcert's"*.baidu.com"
1850.740298*issuer:C=BE;O=GlobalSignnv-sa;CN=GlobalSignRSAOVSSLCA2018
1850.740317*SSLcertificateverifyok.
1850.740391>GET/HTTP/1.1
1850.740391>Host:www.baidu.com
1850.740391>User-Agent:curl/7.83.1
1850.740391>Accept:*/*
1850.740391>
1850.753580*Markbundleasnotsupportingmultiuse
1850.753605
接下來就是上傳的部分了,-F 參數用來向服務器上傳二進制文件。
?curl-v--trace-time'https://postman-echo.com/post'-F'fileName=@"/Users/xiaobox/Desktop/cookies.txt"'
解釋一下這行命令:
- https://postman-echo.com/post 是我找到的一個公共 API,你可以用來測試上傳文件
- -v --trace 上面講過了
- -F 會給 HTTP 請求加上標頭 Content-Type: multipart/form-data,然后將我桌面的文件 cookies.txt 作為 file 字段上傳。
-F 參數可以指定 MIME 類型,也可以改文件名。
curl-v--trace-time'https://postman-echo.com/post'-F'fileName=@/Users/xiaobox/Desktop/cookies.txt;type=text/plain;filename=me.txt'
- 上面命令指定 MIME 類型為 text/plain,否則 curl 會把 MIME 類型設為 application/octet-stream
- 上面命令中,原始文件名為 cookies.txt,但是服務器接收到的文件名為 me.txt。
最后總結,如果你想用一條 cURL 命令測試上傳接口,可以利用類似下面的參數組合:
curl-v--trace-time'https://postman-echo.com/post'-F'fileName=@/Users/xiaobox/Desktop/cookies.txt;type=text/plain;filename=me.txt'
弱網測試
顧名思義,就是模擬你的客戶端用戶在網絡較差的環境下,比如 網速很低的時候,網絡請求的情況。
我們還是拿百度舉例子,你可以用以下一組命令在 1k 和 200B 的不同速度下對比看看響應情況:
curl-v--trace-time--limit-rate1khttp://www.baidu.com
curl-v--trace-time--limit-rate200Bhttp://www.baidu.com
注意 limit-rate 是同時限制 request 和 response,也就是 請求、響應都限制成一樣的速率了。
自動重定向
?curlhttps://www.bilibili.com
Redirectingto"http://www.bilibili.com/?rt=V%2FymTlOu4ow%2Fy4xxNWPUZ91QLE3Z%2BfhZ8P5SQVD30Nw%3D">//www.bilibili.com/?rt=V%2FymTlOu4ow%2Fy4xxNWPUZ91QLE3Z%2BfhZ8P5SQVD30Nw%3D.%
你看到了 B 站給我們重定向了,我們可以利用 -L 參數讓 cURL 自動重定向。
curl-Lhttsp://www.bilibili.com
注意 是大寫的 L
科學上網后 cURL 不通?
假設你已經配置了科學上網,我們直接 cURL google 看一下
?curl-vhttps://www.google.com
*Trying74.86.151.167:443...
*connectto74.86.151.167port443failed:Operationtimedout
*Failedtoconnecttowww.google.comport443after75400ms:Operationtimedout
*Closingconnection0
curl:(28)Failedtoconnecttowww.google.comport443after75400ms:Operationtimedout
一般情況下是失敗的
再假設你用的 VPN 客戶端是 clashX
因為我用的是這個,就用這個舉例。
點擊 “復制終端代理命令”,然后在你的終端執行一下:
?exporthttps_proxy=http://127.0.0.1:7890http_proxy=http://127.0.0.1:7890all_proxy=socks5://127.0.0.1:7890
再用 cURL, 你會發現就可以成功了。如果你用的不是 clashX
其他的 VPN 客戶端應該也有類似功能
保存響應內容 ?
可以利用 -o 參數將響應的結果保存到文件中:
curl-ogoogle.txthttps://www.google.com
下載文件并顯示進度?
cURL 可以當 wget 用
-o 參數將服務器的回應保存成文件,等同于 wget 命令
下載文件的同時顯示進度可以使用類似下面的命令:
?curl-#-opic.jpghttps://w.wallhaven.cc/full/pk/wallhaven-pk6993.png
參數太多,不想拼?
cURL 是好用,但如果我是個 web 應用,需要拼接一堆參數,那太麻煩了,簡直勸退。
是的,所以 瀏覽器也想到了,你可以在瀏覽器先正常發出請求,然后利用瀏覽器的工具將 cURL 的命令復制出來。
可以復制單個請求,也可以是頁面的所有請求。然后你就可以粘貼到終端執行了。
是不是很方便 ?
獲取所在地 IP
curl-Ltool.lu/ip
#or
curl-Lip.tool.lu
獲取天氣預報?
我們看看北京的:
curl'wttr.in/Beijing?lang=zh'
吐槽蘋果
這是一則去年關于 cURL 的舊新聞:https://www.163.com/dy/article/GTOGN8D20544B1XD.html
curl 作者吐槽蘋果把他當做免費工具人
了解這樣的新聞可以幫助你更深刻地認識開源、商業以及整個軟件的生態情況。
審核編輯:湯梓紅
-
服務器
+關注
關注
12文章
9123瀏覽量
85324 -
開源
+關注
關注
3文章
3309瀏覽量
42471 -
Curl
+關注
關注
0文章
15瀏覽量
8176
原文標題:妙用 cURL
文章出處:【微信號:yikoulinux,微信公眾號:一口Linux】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論