cURL 項目的組成部分
cURL 項目主要由兩部分組成:
- 命令行工具 curl;
- 提供 C API 的 libcurl 庫什黑;
這兩個工具和庫都基于網(wǎng)絡(luò)協(xié)議断国,為指定的 URL 資源執(zhí)行網(wǎng)絡(luò)傳輸伶丐。
curl 的默認(rèn)配置文件
- 類 Unix 系統(tǒng):
.curlrc
文件。 - Windows 系統(tǒng):
_curlrc
文件翼悴。
-h
:列出所有的命令行選項
列出 curl 命令行工具所有的選項赡矢,并提供簡要的說明:
curl -h
curl --help
輸出 curl 整個手冊以及常見的用例教程:
curl --manual
-v
:詳細(xì)(verbose)模式
讓 curl 切換到詳細(xì)模式:
curl -v http://example.com
curl --verbose http://example.com
讓 curl 打開詳細(xì)模式并進(jìn)行 HTTP 重定向:
curl -vL http://example.com
curl --verbose --location http://example.com
關(guān)閉詳細(xì)模式:
curl --no-verbose http://example.com
不使用 schema
URL 是 curl 的操作對象溅潜。實際上肋演,更準(zhǔn)確的名稱是 URI(統(tǒng)一資源標(biāo)識符)抑诸。
URL 以 “schema” 作為開頭,schema 是 “http://” 這部分內(nèi)容的官方名稱奸绷,用以告訴 curl 傳入的 URL 使用了哪個協(xié)議层玲。
curl 允許用戶省略 URL 的 schema 部分。curl 會根據(jù)主機(jī)名的第一部分猜測要使用哪種協(xié)議《杳保可檢測的協(xié)議包括 FTP、DICT授药、LDAP悔叽、IMAP娇澎、SMTP 和 POP3。沒有提供 schema 的其他 URL 將默認(rèn)使用 HTTP 協(xié)議戚啥。
可以通過 --proto-default
選項將默認(rèn)協(xié)議修改為 HTTP 以外的其他協(xié)議。
身份驗證
使用給定的用戶名和密碼列出 FTP 服務(wù)器目錄中的內(nèi)容:
curl ftp://user:password@example.com/
Basic 身份驗證:要讓 curl 發(fā)出帶有身份驗證的 HTTP 請求拖云,可以用 -u
或 --user
選項提供用戶名和密碼:
curl -u admin:123456 http://example.com/
如果要讓 curl 先確認(rèn)服務(wù)器是否真的需要身份驗證江兢,可以使用 --anyauth
選項邑贴,它會自動使用 curl 所知道的最安全的身份驗證方法。curl 將嘗試無須身份驗證的請求繁疤,然后在必要時使用身份驗證:
curl --anyauth --user admin:123456 http://example.com/
使用 .netrc
文件或配置文件可以避免在命令行上指定用戶名和密碼。
主機(jī)名或地址
指定 IPV4 地址:
curl http://127.0.0.1/
使用 IPV6 地址需要將其放在方括號中:
curl http://[::1]/
curl http://[2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b]/
指定 FTP 類型
告訴 curl FTP 資源的文件類型以適應(yīng)不同的傳輸模式。
ASCII 類型:
curl "ftp://example.com/foo;type=A"
二進(jìn)制類型(默認(rèn)):
curl "ftp://example.com/foo;type=I"
目錄類型:
curl "ftp://example.com/foo;type=D"
多個選項和多個 URL
curl 支持?jǐn)?shù)百個命令行選項和無限數(shù)量的 URL叹放。
curl 會在處理完最后一個 URL 后返回一個退出碼。
可以通過 --fail-early
選項讓 curl 在第一次出現(xiàn)錯誤時就退出俱恶。
--next
:在一組選項和 URL 之間插入間隔
當(dāng)命令行解析到 --next
選項時,它會將后面的選項應(yīng)用于下一組 URL端仰。
curl --location http://example.com/1 --next
--data sendthis http://example.com/2 --next
--head http://example.com/3
URL 通配
curl 使用保留符號 []
和 {}
進(jìn)行通配。可以使用 -g
或 --globoff
禁用它臀稚。
數(shù)值范圍窜管、字母范圍幕帆、列表
可以使用 [N-M]
語法來指定一個數(shù)值范圍,其中 N 是起始索引碱茁,M 是結(jié)束索引。
請求 100 個以數(shù)字命名的圖像:
curl -O http://example.com/[1-100].png
curl -O http://example.com/[001-100].png
支持指定步進(jìn)募壕,指定步進(jìn)為2:
curl -O http://example.com/[1-100:2].png
curl 也可以處理字母范圍:
curl -O http://example.com/section[a-z].html
通過花括號指定完整的列表:
curl -O http://example.com/{one,two,three,alpha,beta}.html
組合使用多個通配符
下載 Ben缰泡、Alice 和 Frank 的圖像棘钞,并且需要 100x100 和 1000x1000 的分辨率:
curl -O http://example.com/{Ben,Alice,Frank}-{100x100,1000x1000}.jpg
獲取 Web 服務(wù)器和郵件服務(wù)器一周內(nèi)的日志:
curl -O http://example.com/{web,mail}-log[0-6].txt
--config
:配置文件
使用 -K
或者 --config
選項讓 curl 從特定的文件中讀取更多的命令行選項:
curl -K cmdline.txt http://example.com
cmdline.txt 文件中包含了你輸入的每行命令:
# 這是注釋硝逢,我們要求跟蹤重定向
--location
# 要求發(fā)送 HEAD 請求
--head
# 支持使用不帶破折號的長選項
location
# 命令行選項的參數(shù)必須與該選項處于同一行
user-agent "Everything-is-an-agent"
# 支持在選項與參數(shù)之間使用=或者:
user-agent = "Everything-is-an-agent"
# 如果參數(shù)中帶有空格叫乌,則必須使用雙引號
# 如果想在配置文件中指定 URL憨奸,則必須使用 --url 或 url
url = "http://example.com"
進(jìn)度指示器
- 進(jìn)度指示器顯示的單位是字節(jié)(Byte, 1 Byte = 8 bit)數(shù)和每秒字節(jié)數(shù)似芝。
- 通過
-s
或--silent
選項可以強(qiáng)制關(guān)閉進(jìn)度指示器。 - 啟用靜默模式后,可以通過
-s
或--show-error
選項來要求它在發(fā)生錯誤時輸出錯誤信息蝇闭。 - 通過
-#
或--progress-bar
選項使用一個更簡單的進(jìn)度指示器。
--trace
和 --trace-ascii
--trace [filename]
選項可以將完整的跟蹤信息(十六進(jìn)制編碼)保存在指定的文件中逻悠。
--trace-ascii [filename]
可以將跟蹤信息轉(zhuǎn)化為 ASCII 編碼。
--trace-time
,在輸出信息前添加高精度的時間戳琅豆。
curl --trace dump http://example.com
HTTP/2
在使用 HTTP/2 進(jìn)行文件傳輸時,curl 將發(fā)送和接收被壓縮的標(biāo)頭信息冻押。但是為了以可讀性和可理解的方式顯示傳出和傳入的 HTTP/2 標(biāo)頭信息,curl 將顯示未經(jīng)壓縮的版本。
保存下載的內(nèi)容
可以通過 -o [filename]
或 --output
保存下載內(nèi)容到指定的文件狈邑。
curl -o output.html http://example.com/
-O
(大寫的 O)或 --remote-name
:用 URL 指定的文件名保存內(nèi)容:
curl -O http://example.com/file.html
--compressed
:壓縮
curl 可以要求 HTTP 和 HTTPS 服務(wù)器提供壓縮過的數(shù)據(jù)糕伐。
--compressed
請求服務(wù)器使用一種受支持的壓縮算法來壓縮數(shù)據(jù),curl 會在保存或發(fā)送數(shù)據(jù)到 stdout 之前對數(shù)據(jù)進(jìn)行解壓。
curl --compressed http://example.com/
壓縮傳輸編碼
客戶端要求服務(wù)器進(jìn)行壓縮傳輸編碼赞庶,如果服務(wù)器接受了,它將作出響應(yīng),并通過一個標(biāo)頭指明它將進(jìn)行壓縮編碼丧靡,curl 將在接收到數(shù)據(jù)時對其進(jìn)行解壓饭庞。
用戶可以通過 --tr-encoding
選項請求服務(wù)器進(jìn)行壓縮傳輸編碼:
curl --tr-encoding http://example.com/
不過需要注意的是绸狐,并非所有的 HTTP 服務(wù)器都支持這個特性葬凳。
shell 重定向
使用 > filename
將 stdout 重定向到指定文件中,使用 2>file
將 stderr (元數(shù)據(jù)或錯誤等)重定向到指定文件中镜豹。
curl http://example.com > files.html 2>errors
速率限定
在傳輸數(shù)據(jù)時,curl 會嘗試盡快完成任務(wù)昔期。它可以用于上傳和下載。
可以使用 --limit-rate [speed]
讓 curl 的速率不超過指定的字節(jié)/秒。
curl https://example.com/ --limit-rate 200k
最大的文件
為 curl 指定可接受的最大下載字節(jié)數(shù):
curl --max-filesize 100000 https://example.com/
在文件系統(tǒng)中保存元數(shù)據(jù)
在將下載的內(nèi)容保存到文件時,可以通過 --xattr
選項告訴 curl 將某些文件元數(shù)據(jù)也保存在“擴(kuò)展文件屬性”中人芽。
--raw
如果使用 --raw
選項,curl 會禁用所有內(nèi)部的 HTTP 內(nèi)容解碼或傳輸編碼,取而代之的是傳輸未經(jīng)修改的原始數(shù)據(jù)名挥。
如果你正在開發(fā)某種中間軟件,并希望將內(nèi)容傳給另一個 HTTP 客戶端讓它來解碼,那么這個選項就很有用了鞋既。
失敗重試
通常 curl 只會嘗試執(zhí)行一次傳輸不成功則返回錯誤畏邢。你可以使用 --retry
選項讓 curl 重試失敗的傳輸。
恢復(fù)下載
在恢復(fù)下載時,curl 會檢查本地已存在的文件的大小咆贬,然后向服務(wù)器請求剩余的內(nèi)容,并追加到本地的文件中。
-C
或 --continue-at
選項可以告訴 curl 從哪里開始傳輸酌儒,選項的值可以是一個普通的數(shù)字字節(jié)偏移量酪夷,或者使用字符串 -
讓 curl 根據(jù)它所知道的信息自己決定從哪里開始傳輸插掂。
從字節(jié)偏移量為 100 的位置開始下載 FTP 文件:
curl --continue-at 100 ftp://example.com/bigfile
繼續(xù)之前中斷的下載:
curl --continue-at - ftp://example.com/bigfile
HTTP 區(qū)間
可以用 -r
或者 --range
讓 curl 發(fā)起區(qū)間請求酝润,請求特定區(qū)間的數(shù)據(jù)构回。
向遠(yuǎn)程服務(wù)器請求特定字節(jié)范圍的內(nèi)容脐供。請求從偏移量 100 開始的 1000 個字節(jié):
curl --range 100-1099 ftp://example.com/bigfile
請求前 200 個字節(jié)的數(shù)據(jù):
curl -r 0-199 http://example.com/
索引 200 之后的所有內(nèi)容:
curl -r 200- http://example.com/
從索引 0 處獲取 200 個字節(jié)掏愁,再從索引 1000 處獲取 200 個字節(jié):
curl -r 0-199,1000-199 http://example.com/
連接超時
可以用 --connect-timeout
設(shè)置 curl 允許嘗試連接的最長時間沦泌。
keepalive
curl 默認(rèn)使用 TCP 的 keepalive 特性實現(xiàn)長連接。
使用 --no-keepalive
禁用 keepalive 特性:
curl --no-keepalive https://example.com/
使用 --keepalive-time
來指定發(fā)送探測的頻率,默認(rèn)為 60 秒。
將 TCP “ping” 之間的間隔改為 5 分鐘:
curl --keepalive-time 300 https://example.com/
允許的最長時間
在 curl 拋出超時錯誤碼(28)并退出前,可以用 -m
或 --max-time
選項告訴 curl 最長有多少時間(以秒為單位)可用憔古。當(dāng)指定的時間耗盡即碗,無論當(dāng)時發(fā)生什么内舟,curl 都會退出验游,即使它正在傳輸數(shù)據(jù)。
指定的最長時間可以用小數(shù)表示炒俱,0.5 表示 50 毫秒推盛,2.37 表示 2370 毫秒:
curl --max-time 5.5 https://example.com/
傳輸速率慢到一定程度就退出
你可以告訴 curl榔昔,如果傳輸速率低于某個特定值,并且在某個時間段內(nèi)一直低于這個值瘪菌,那么就放棄傳輸撒会。
例如,如果 15 秒內(nèi)的傳輸速率低于 1000 字節(jié)/秒师妙,則停止傳輸:
curl --speed-time 15 --speed-limit 1000 https://example.com/
啟用 TLS
使用 --ss1
選項意味著 cur1 會嘗試將連接升級到 TLS,但如果失敗默穴,它仍將繼續(xù)使用明文協(xié)議來執(zhí)行傳輸怔檩。
curl --ssl http://example.com/file.txt
如果一定要使用 TLS 連接,可以使用 -ssl-reqd
選項蓄诽,使用這個選項時如果 curl 無法成功進(jìn)行 TLS 協(xié)商薛训,傳輸就會失敗。
curl --ssl-reqd http://example.com/file.txt
HTTP 版本
從 2016 年年中開始仑氛,curl 默認(rèn)用 HTTP/1.1 連接 HTTP 服務(wù)器乙埃。如果要連接到 HTTPS 服務(wù)器,并且你的 libcurl 內(nèi)置了 HTTP/2 功能锯岖,那么 cur1 將嘗試使用 HTTP/2介袜,或在協(xié)商失敗時降級至 HTTP/1.1。默認(rèn)情況下嚎莉,不支持 HTTP/2 的 curl 將使用 hTTP/1.1米酬。
HTTP POST
POST 是為將數(shù)據(jù)發(fā)送到 Web 應(yīng)用而發(fā)明的 HTTP 方法,也是 HTML 表單中最常用的方法趋箩。它通常會向接收者發(fā)送相對少量的數(shù)據(jù)塊赃额。
在表單中填充好數(shù)據(jù)后,瀏覽器以“URL編碼”的形式(以&符號分隔的一系列鍵值對)將數(shù)據(jù)發(fā)送出去叫确√迹可以用 curl 的 -d
或 -data
選項發(fā)送這樣的數(shù)據(jù),如下所示:
curl -d 'name=admin&shoesize=12' http://example.com/
Content-Type
用 curl 的 -d
或 -data
選項發(fā)送 POST 請求時竹勉,請求中默認(rèn)會包含一個類似 Content-Type: application/X-www-form-urlencoded
這樣的標(biāo)頭飞盆。
如果想將 JSON POST 到服務(wù)器,并且準(zhǔn)確地告訴服務(wù)器你發(fā)送的內(nèi)容是什么類型次乓,可以參見如下代碼:
curl -d '{json}' -H 'Content-Type:application/json' http://example.com/
POST 二進(jìn)制內(nèi)容
--data-binary @filename
選項可以讓 curl 從文件中讀取二進(jìn)制內(nèi)容吓歇。
curl --data-binary @filename http://example.com/
URL 編碼
curl 提供了 --data-urlencode
選項,可以讓用戶輸入未經(jīng)編碼的數(shù)據(jù)票腰,然后讓 curl 自動編碼城看。
轉(zhuǎn)換為 GET
-G
或 --get
選項可以將 -d
選項指定的數(shù)據(jù)附加到 URL 右邊,并使用 “?” 隔離杏慰,然后讓 curl 用 GET 方法發(fā)送數(shù)據(jù)测柠。
curl --get --data <data> <url>
curl --include \
http://localhost:7001/api/v1/applications \
--get --data 'name1=value1&name2=value2'
分塊編碼的 POST
通過使用分塊傳輸編碼,curl 將逐塊發(fā)送 POST 數(shù)據(jù)缘滥,每個數(shù)據(jù)塊中會包含塊的大小轰胁。
curl -H "Transfer-Encoding: chunked" -d "payload to send" http://example.com/
使用 curl 發(fā)送表單
multipart formpost 是指 HTTP 客戶端在 HTML 表單的 enctype
屬性被設(shè)置為 “multipart/form-data”
時所發(fā)送的內(nèi)容。
HTML 示例:
<form action="submit.cgi" method="post" enctype=“multipart/form-data”>
Name: <input type="text" name="person"><br>
File: <input type="file" name="secret"><br>
<input type="submit" value="提交">
</form>
使用 curl 時朝扼,可以通過-F
(或 --form
)選項添加每個單獨(dú)的 multipart赃阀。
使用 curl 發(fā)送以上的表單數(shù)據(jù):
curl -F person=anonymous -F secret=@file.txt http://example.com/submit.cgi
HTTP 重定向
顧名思義,“重定向”是指服務(wù)器向客戶端發(fā)送指令擎颖,而不是返回客戶端想要的內(nèi)容凹耙。服務(wù)器好像在說:“去這里找你想要的東西〕σ牵”
但并非所有的重定向都是一樣的肖抱。重定向是永久性的嗎?客戶端在下一個請求中應(yīng)該使用哪種請求方法异旧?
進(jìn)行重定向時需要發(fā)送一個 Location: 標(biāo)頭其中包含新的 URI意述,可以是絕對路徑或相對路徑。
自定義標(biāo)頭
可以通過 -H
或 --header
選項自定義標(biāo)頭吮蛹。
curl -H "Host: test.example" http://example.com/
referer
當(dāng)用戶點(diǎn)擊網(wǎng)頁上的鏈接時荤崇,瀏覽器會將用戶帶到下一個 URL,它會在新的請求中添加 referer
標(biāo)頭潮针,表面請求的來源术荤。
可以在 curl 中用 -e
或 --referer
選項來設(shè)置 referer
標(biāo)頭:
curl --referer http://comes-form.example.com https://example.com/
User-Agent
客戶端可以在請求中設(shè)置 User-Agent
標(biāo)頭,用于告訴服務(wù)器它屬于哪種用戶代理每篷。有時服務(wù)器會檢查這個標(biāo)頭瓣戚,并根據(jù)標(biāo)頭內(nèi)容決定如何作出響應(yīng)端圈。
可以用 -A
或 --user-agent
選項加上要使用的字符串來設(shè)置你喜歡的值:
從文件中讀取 cookie
curl 使用的 cookie 文件格式叫做 Netscape cookie 格式。
-b
指示讓 curl 從指定的文件讀取初始 cookie:
curl -L -b cookies.txt https://example.com/
將 cookie 寫入文件
讓 curl 在退出之前將已知的 cookie 寫入文件(也就是 cookie jar)中子库。
可以用 -c
選項指定 cookie jar舱权,讓 curl 將 cookie 寫入該文件中:
curl -c cookie-jar.txt https://example.com/
新 cookie 會話
刷新 cookie 會話意味著所有會話 cookie 都將被丟棄,這相當(dāng)于重啟瀏覽器仑嗅。
可以通過 -j
或 --junk-session-cookies
選項讓 curl 開始新的 cookie 會話:
curl -j -b cookies.txt https://example.com/
HTTP/2
默認(rèn)情況下宴倍,發(fā)起 HTTP 請求時,curl 默認(rèn)用 HTTP/1.1 連接 HTTP 服務(wù)器仓技。而發(fā)起 HTTPS 請求時鸵贬,curl 會默認(rèn)使用 HTTP/2。
可以用以下代碼讓 curl 請求服務(wù)器時使用 HTTP/2:
curl --http2 http://example.com/
如果你已經(jīng)知道服務(wù)器支持 HTTP/2(例如脖捻,在自己的受控環(huán)境中阔逼,你確切地知道服務(wù)器上運(yùn)行的是什么),那么可以通過 --http2-prior-knowledge
選項進(jìn)行快捷的 HTTP/2 “協(xié)商”郭变。
多路復(fù)用
HTTP/2 協(xié)議的主要特性之一是能夠在同一物理連接上復(fù)用多個邏輯流颜价。在使用 curl 命令行工具時,你無法利用這個很酷的特性诉濒,因為 curl 嚴(yán)格按照串行的方式執(zhí)行網(wǎng)絡(luò)請求周伦,一個接一個,后一個要在前一個結(jié)束后才能開始未荒。
希望未來的 curl 版本可以支持這項特性专挪。