認(rèn)識(shí) 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 是常用的開源命令行工具,用來請(qǐng)求 Web 服務(wù)器。它的名字就是客戶端(client)的 URL 工具的意思。它的功能非常強(qiáng)大,命令行參數(shù)多達(dá)幾十種。它支持包括 FTP、HTTP、HTTPS、FTP、SCP,SFTP 數(shù)十種協(xié)議。如能熟練使用,可以在很多應(yīng)用場景下,發(fā)揮巨大的價(jià)值。
cURL 的使用
代替 Postman ?
curlhttps://www.baidu.com
如上命令,不帶有任何參數(shù)時(shí),curl 就是發(fā)出 GET 請(qǐng)求,服務(wù)器返回的內(nèi)容會(huì)在命令行輸出。當(dāng)然,你還可以為其添加各種參數(shù)(如 -A、-b、-c、-d、-e、-F、-H 等等),使得可以完成更多復(fù)雜任務(wù);
其實(shí),如果只是簡單的 Post、Get 請(qǐng)求,用 cURL 做像接口測試的工作是非常方便的。
有人說了,Postman 它不香嗎?
是的,挺香的,但是當(dāng)你在環(huán)境受限的情況下,比如 在 linux 服務(wù)器上想測試一下接口通不通沒有 Postman 怎么辦?
這時(shí)候 cURL 就體現(xiàn)出它的價(jià)值了。此外貼心的 Postman,還為我們提供了各種語言和 cURL 的 snippet,方便你在 Postman 編輯完成后直接拿走開發(fā)和調(diào)試使用。
如上圖,你直接 copy 內(nèi)容,然后在命令行執(zhí)行就可以了。
小工具了解一下
jsonplaceholder http://jsonplaceholder.typicode.com/
免費(fèi)的 HTTP 請(qǐng)求假數(shù)據(jù)接口,前端同學(xué)可以了解一下
- 不需引入外部 js 文件。
- 同時(shí)支持 http 和 https 請(qǐng)求。
- 同時(shí)支持 post 請(qǐng)求和 get 請(qǐng)求。
看看 cookie?
curl-bcookies.txthttps://www.youku.com
上面命令將服務(wù)器的 HTTP 回應(yīng)所設(shè)置 Cookie 寫入文本文件 cookies.txt。
上傳個(gè)文件?
網(wǎng)站中上傳文件功能很普遍,然而你是怎么調(diào)試的呢?
打開頁面,選擇文件后再點(diǎn)擊上傳按鈕?然后 F12 看看 Request、Response? 或者打開 Postman 進(jìn)行類似步驟?
可真夠麻煩的。用 cURL 一行命令搞定
這里先介紹一下 -v 參數(shù):
“使用 -v 參數(shù)使 curl 打印有關(guān)請(qǐng)求和響應(yīng)的詳細(xì)信息。以 > 為前綴的行是發(fā)送給服務(wù)器的數(shù)據(jù),以 < 為前綴的行是從服務(wù)器接收的數(shù)據(jù),以 * 開頭的行是雜項(xiàng)信息,如連接信息、SSL 握手信息、協(xié)議信息等。
”
我們看個(gè)例子,搞下百度:
?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
百度一下,你就知道 ©2017Baidu使用百度前必讀意見反饋京ICP證030173號(hào)
*Connection#0tohostwww.baidu.comleftintact
可以看到,包括握手過程、請(qǐng)求、響應(yīng)信息一應(yīng)俱全。
加 -v 參數(shù)的作用就是就是為了跟蹤(trace)一下請(qǐng)求,看看具體細(xì)節(jié),這跟你 F12 的目的是一樣的。此外,如果你想看到具體的請(qǐng)求、響應(yīng)時(shí)間點(diǎn)可以加入 --trace-time 參數(shù),最后的命令如下:
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 參數(shù)用來向服務(wù)器上傳二進(jìn)制文件。
?curl-v--trace-time'https://postman-echo.com/post'-F'fileName=@"/Users/xiaobox/Desktop/cookies.txt"'
解釋一下這行命令:
- https://postman-echo.com/post 是我找到的一個(gè)公共 API,你可以用來測試上傳文件
- -v --trace 上面講過了
- -F 會(huì)給 HTTP 請(qǐng)求加上標(biāo)頭 Content-Type: multipart/form-data,然后將我桌面的文件 cookies.txt 作為 file 字段上傳。
-F 參數(shù)可以指定 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 會(huì)把 MIME 類型設(shè)為 application/octet-stream
- 上面命令中,原始文件名為 cookies.txt,但是服務(wù)器接收到的文件名為 me.txt。
最后總結(jié),如果你想用一條 cURL 命令測試上傳接口,可以利用類似下面的參數(shù)組合:
curl-v--trace-time'https://postman-echo.com/post'-F'fileName=@/Users/xiaobox/Desktop/cookies.txt;type=text/plain;filename=me.txt'
弱網(wǎng)測試
顧名思義,就是模擬你的客戶端用戶在網(wǎng)絡(luò)較差的環(huán)境下,比如 網(wǎng)速很低的時(shí)候,網(wǎng)絡(luò)請(qǐng)求的情況。
我們還是拿百度舉例子,你可以用以下一組命令在 1k 和 200B 的不同速度下對(duì)比看看響應(yīng)情況:
curl-v--trace-time--limit-rate1khttp://www.baidu.com
curl-v--trace-time--limit-rate200Bhttp://www.baidu.com
注意 limit-rate 是同時(shí)限制 request 和 response,也就是 請(qǐng)求、響應(yīng)都限制成一樣的速率了。
自動(dòng)重定向
?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 參數(shù)讓 cURL 自動(dòng)重定向。
curl-Lhttsp://www.bilibili.com
注意 是大寫的 L
科學(xué)上網(wǎng)后 cURL 不通?
假設(shè)你已經(jīng)配置了科學(xué)上網(wǎng),我們直接 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
一般情況下是失敗的
再假設(shè)你用的 VPN 客戶端是 clashX
因?yàn)槲矣玫氖沁@個(gè),就用這個(gè)舉例。
點(diǎn)擊 “復(fù)制終端代理命令”,然后在你的終端執(zhí)行一下:
?exporthttps_proxy=http://127.0.0.1:7890http_proxy=http://127.0.0.1:7890all_proxy=socks5://127.0.0.1:7890
再用 cURL, 你會(huì)發(fā)現(xiàn)就可以成功了。如果你用的不是 clashX
其他的 VPN 客戶端應(yīng)該也有類似功能
保存響應(yīng)內(nèi)容 ?
可以利用 -o 參數(shù)將響應(yīng)的結(jié)果保存到文件中:
curl-ogoogle.txthttps://www.google.com
下載文件并顯示進(jìn)度?
cURL 可以當(dāng) wget 用
-o 參數(shù)將服務(wù)器的回應(yīng)保存成文件,等同于 wget 命令
下載文件的同時(shí)顯示進(jìn)度可以使用類似下面的命令:
?curl-#-opic.jpghttps://w.wallhaven.cc/full/pk/wallhaven-pk6993.png
參數(shù)太多,不想拼?
cURL 是好用,但如果我是個(gè) web 應(yīng)用,需要拼接一堆參數(shù),那太麻煩了,簡直勸退。
是的,所以 瀏覽器也想到了,你可以在瀏覽器先正常發(fā)出請(qǐng)求,然后利用瀏覽器的工具將 cURL 的命令復(fù)制出來。
可以復(fù)制單個(gè)請(qǐng)求,也可以是頁面的所有請(qǐng)求。然后你就可以粘貼到終端執(zhí)行了。
是不是很方便 ?
獲取所在地 IP
curl-Ltool.lu/ip
#or
curl-Lip.tool.lu
獲取天氣預(yù)報(bào)?
我們看看北京的:
curl'wttr.in/Beijing?lang=zh'
吐槽蘋果
這是一則去年關(guān)于 cURL 的舊新聞:https://www.163.com/dy/article/GTOGN8D20544B1XD.html
curl 作者吐槽蘋果把他當(dāng)做免費(fèi)工具人
了解這樣的新聞可以幫助你更深刻地認(rèn)識(shí)開源、商業(yè)以及整個(gè)軟件的生態(tài)情況。
審核編輯:湯梓紅
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
9029瀏覽量
85207 -
開源
+關(guān)注
關(guān)注
3文章
3256瀏覽量
42420 -
Curl
+關(guān)注
關(guān)注
0文章
15瀏覽量
8164
原文標(biāo)題:妙用 cURL
文章出處:【微信號(hào):yikoulinux,微信公眾號(hào):一口Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論