curl是一個(gè)命令行工具栏豺,通過(guò)指定的URL來(lái)上傳或下載數(shù)據(jù)翔怎,并將數(shù)據(jù)展示出來(lái)窃诉。curl中的c
表示client杨耙,而URL,就是URL飘痛。這里我們介紹一下curl的使用珊膜。
1. 命令行基礎(chǔ)
1.1 命令行選項(xiàng)
1. 短形式
在curl中可以使用短形式的命令行選項(xiàng),比如通知curl打開(kāi)verbose模式宣脉,可以使用-v
選項(xiàng):
$ curl -v www.baidu.com
這里车柠,-v
就是短形式的選項(xiàng),我們使用一個(gè)中劃線(xiàn)(-)并緊跟著一個(gè)字母來(lái)指定一個(gè)短形式的選項(xiàng)塑猖。
在這個(gè)例子中竹祷,-v
就像一個(gè)開(kāi)關(guān)一樣,指定某個(gè)變量是false
還是true
羊苟。我們可以在一個(gè)中劃線(xiàn)后面跟多個(gè)單字母的選項(xiàng):
$ curl -vL www.baidu.com
在curl中塑陵,命令行解析器總是解析整個(gè)命令行,因此蜡励,選項(xiàng)可以放在整個(gè)命令行的任何位置:
$ curl www.baidu.com -vL
這個(gè)和上面的命令具有同樣的效果令花。當(dāng)然,雖然是任何位置凉倚,但不能放在curl
前面凹娑肌:
$ -vL curl www.baidu.com // No command '-vL' found
2. 長(zhǎng)形式
單個(gè)字母的選項(xiàng)敲起來(lái)和用起來(lái)都很方便,但是字母的個(gè)數(shù)有限而需要控制的東西又太多稽寒,這個(gè)時(shí)候就可以使用選項(xiàng)的長(zhǎng)形式扮碧。同樣,為了使得命令便于閱讀杏糙,絕大多數(shù)短形式都有一個(gè)對(duì)應(yīng)的長(zhǎng)形式慎王。
和短形式不同的是,長(zhǎng)形式的選項(xiàng)使用兩個(gè)中劃線(xiàn)(--)指定搔啊,然后緊跟著具體的選項(xiàng)。還有就是北戏,在使用長(zhǎng)形式的時(shí)候负芋,—
后面只能跟一個(gè)選項(xiàng)。對(duì)于-v
嗜愈,對(duì)應(yīng)的長(zhǎng)形式如下:
$ curl --verbose www.baidu.com
同樣旧蛾,長(zhǎng)形式的選項(xiàng)也可以出現(xiàn)在命令的任何地方:
$ curl www.baidu.com --verbose
對(duì)于-vL
來(lái)說(shuō),對(duì)應(yīng)的長(zhǎng)形式可以是:
$ curl --verbose --location www.baidu.com
或者:
$ curl --location www.baidu.com --verbose
3. 選項(xiàng)的參數(shù)
在上面的命令中選項(xiàng)-v
(或--verbose
)以及-L
(或--location
)都是bool
類(lèi)型的標(biāo)志位蠕嫁,來(lái)告訴curl打開(kāi)或關(guān)閉某些特征锨天。curl還有一種類(lèi)型的選項(xiàng),就是需要傳遞一些參數(shù)剃毒。比如病袄,如果想在一個(gè)HTTP POST中向服務(wù)器傳遞一個(gè)字符串:
$ curl -d arbitrary http://example.com
同樣搂赋,也可以使用相應(yīng)的長(zhǎng)形式:
$ curl --data arbitrary http://example.com
4. 參數(shù)有空格?
在上面的例子中益缠,我們的參數(shù)arbitrary
是一個(gè)連續(xù)的字符串脑奠,但是當(dāng)我們需要傳遞一個(gè)有空格的參數(shù)怎么辦?比如Are you OK?
幅慌,這時(shí)我們需要使用引號(hào)把參數(shù)括起來(lái):
$ curl -A "Are you OK?" http://example.com
如果不加引號(hào)的話(huà):
$ curl -A Are you OK? http://example.com
那么curl只會(huì)把Are
當(dāng)做用戶(hù)的參數(shù)宋欺,剩下的字符,you
和OK?
會(huì)被curl當(dāng)做額外的URL處理胰伍,因?yàn)檫@里并沒(méi)有用-
指定這是一個(gè)選項(xiàng)齿诞。
但是如果參數(shù)本身有引號(hào)的時(shí)候怎么辦?這在使用JSON傳遞參數(shù)的時(shí)候尤其常見(jiàn)骂租,我們可以使用單引號(hào)把參數(shù)括起來(lái)(不過(guò)在Windows中不管用):
$ curl -d '{"name":"fool"}' http://example.com
當(dāng)數(shù)據(jù)很多時(shí)祷杈,我們可以指定一個(gè)文件,來(lái)傳遞給curl:
$ curl -d @params.json http://example.com
5. Say No
對(duì)于像-t
和-L
之類(lèi)的標(biāo)志選項(xiàng)菩咨,我們可以在長(zhǎng)形式的前面加上no-
前綴來(lái)指定關(guān)閉相應(yīng)的特征吠式,比如關(guān)閉verbose
模式:
$ curl --no-verbose http://example.com
1.2 URL
curl支持在一個(gè)命令行中處理多個(gè)URL,中間用空格間隔即可抽米。curl會(huì)對(duì)傳進(jìn)來(lái)的URL做簡(jiǎn)單的驗(yàn)證特占,而不會(huì)去驗(yàn)證URL是否真正有效,因此云茸,這里需要使用者提供有效的URL是目。
前面說(shuō)過(guò),curl首先解析整個(gè)命令行标捺,將得到選項(xiàng)應(yīng)用于所有的URL上懊纳。如果想對(duì)每一個(gè)URL使用不同的選項(xiàng),那么可以使用--next
來(lái)指定亡容。比如:
$ curl --location http://example.com/1
--next --data sendthis http://example.com/2
--next head http://example.com/3
1. 配置文件
如果選項(xiàng)過(guò)多嗤疯,導(dǎo)致命令很難輸入,或者超過(guò)了系統(tǒng)命令最大長(zhǎng)度的限制闺兢,我們可以使用配置文件(config file)來(lái)指定curl的選項(xiàng)茂缚。
通過(guò)使用-K
或--config
選項(xiàng)來(lái)告訴curl從指定的文件中讀取選項(xiàng),比如:
$ curl -K curl.options http://example.com
在文件curl.options
中屋谭,列出所有需要的選項(xiàng):
# ask curl to follow redirects
--location
# ask curl to do a HEAD request
--head
和在命令行中一樣脚囊,在配置文件中也可以使用長(zhǎng)形式或短形式,甚至在配置文件中對(duì)于長(zhǎng)形式可以省略那兩個(gè)中劃線(xiàn)(--):
# ask curl to follow redirects
location
# ask curl to do a HEAD request
head
對(duì)于使用參數(shù)的選項(xiàng)桐磁,同樣可以使用配置文件:
# ask curl to change the User-Agent in HTTP header
user-agent "something-is-an-agent"
既然叫做配置文件悔耘,那么上面的選項(xiàng)也可以寫(xiě)作:
# ask curl to change the User-Agent in HTTP header
user-agent = "something-is-an-agent"
甚至可以省略沒(méi)有空格的參數(shù)的引號(hào):
# ask curl to change the User-Agent in HTTP header
user-agent = something-is-an-agent
當(dāng)然,如果參數(shù)中有空格的話(huà)就不能省略引號(hào)了我擂。
2. 開(kāi)始使用curl
在前面我們簡(jiǎn)單地介紹了什么是curl以及一些基礎(chǔ)的命令行知識(shí)衬以。我們通過(guò)命令行的方式將需要處理的URL交給curl去處理缓艳。
在這里,我們開(kāi)始著手使用curl泄鹏,了解curl能做什么以及如何去做郎任。
2.1 Verbose模式
如果curl得到的結(jié)果不是期望的結(jié)果,我們可以使用-v
或--verbose
進(jìn)入Verbose模式獲取更多的信息备籽。
1. 查看通信過(guò)程
在Verbose模式中舶治,curl會(huì)得到更多的對(duì)話(huà)式信息,幫助我們了解發(fā)生了什么车猬。curl會(huì)在每一個(gè)信息前面加上*進(jìn)行標(biāo)識(shí)霉猛。在下面的例子中,我們將百度的首頁(yè)保存下來(lái)(使用-o
選項(xiàng)并指定參數(shù)baidu
):
$ curl -v www.baidu.com -o baidu
我們可以得到如下的信息:
* About to connect() to www.baidu.com port 80 (#0)
* Trying 14.215.177.39... connected
* Connected to www.baidu.com (14.215.177.39) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: www.baidu.com
> Accept: */*
>
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
< Connection: Keep-Alive
< Content-Length: 2381
< Content-Type: text/html
< Date: Fri, 14 Sep 2018 09:55:18 GMT
< Etag: "588604dd-94d"
< Last-Modified: Mon, 23 Jan 2017 13:27:57 GMT
< Pragma: no-cache
< Server: bfe/1.0.8.18
< Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
<
{ [data not shown]
103 2381 103 2381 0 0 113k 0 --:--:-- --:--:-- --:--:-- 232k* Connection #0 to host www.baidu.com left intact
* Closing connection #0
下面的信息是建立一個(gè)鏈接:
* About to connect() to www.baidu.com port 80 (#0)
* Trying 14.215.177.39... connected
* Connected to www.baidu.com (14.215.177.39) port 80 (#0)
然后就是本次的HTTP請(qǐng)求:
> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: www.baidu.com
> Accept: */*
>
接下來(lái)是數(shù)據(jù)的傳輸過(guò)程珠闰。然后就是響應(yīng):
< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
< Connection: Keep-Alive
< Content-Length: 2381
< Content-Type: text/html
< Date: Fri, 14 Sep 2018 09:55:18 GMT
< Etag: "588604dd-94d"
< Last-Modified: Mon, 23 Jan 2017 13:27:57 GMT
< Pragma: no-cache
< Server: bfe/1.0.8.18
< Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
<
連箭頭都不一樣了惜浅。
2. 更詳細(xì)的信息
如果覺(jué)得使用-v
的信息還不夠的話(huà),還可以使用--trace [filename]
選項(xiàng)來(lái)講完整的流保存到filename
中伏嗜。比如:
$ curl --trace dump www.baidu.com
之后坛悉,就可以發(fā)現(xiàn)一個(gè)新的文件dump
,里面保存著剛才那個(gè)會(huì)話(huà)的所有信息:
== Info: About to connect() to www.baidu.com port 80 (#0)
== Info: Trying 14.215.177.39... == Info: connected
== Info: Connected to www.baidu.com (14.215.177.39) port 80 (#0)
=> Send header, 166 bytes (0xa6)
0000: 47 45 54 20 2f 20 48 54 54 50 2f 31 2e 31 0d 0a GET / HTTP/1.1..
0010: 55 73 65 72 2d 41 67 65 6e 74 3a 20 63 75 72 6c User-Agent: curl
0020: 2f 37 2e 31 39 2e 37 20 28 78 38 36 5f 36 34 2d /7.19.7 (x86_64-
0030: 72 65 64 68 61 74 2d 6c 69 6e 75 78 2d 67 6e 75 redhat-linux-gnu
0040: 29 20 6c 69 62 63 75 72 6c 2f 37 2e 31 39 2e 37 ) libcurl/7.19.7
0050: 20 4e 53 53 2f 33 2e 32 37 2e 31 20 7a 6c 69 62 NSS/3.27.1 zlib
0060: 2f 31 2e 32 2e 33 20 6c 69 62 69 64 6e 2f 31 2e /1.2.3 libidn/1.
0070: 31 38 20 6c 69 62 73 73 68 32 2f 31 2e 34 2e 32 18 libssh2/1.4.2
0080: 0d 0a 48 6f 73 74 3a 20 77 77 77 2e 62 61 69 64 ..Host: www.baid
0090: 75 2e 63 6f 6d 0d 0a 41 63 63 65 70 74 3a 20 2a u.com..Accept: *
00a0: 2f 2a 0d 0a 0d 0a /*....
<= Recv header, 17 bytes (0x11)
0000: 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d HTTP/1.1 200 OK.
0010: 0a .
<= Recv header, 22 bytes (0x16)
0000: 41 63 63 65 70 74 2d 52 61 6e 67 65 73 3a 20 62 Accept-Ranges: b
0010: 79 74 65 73 0d 0a ytes..
文件的前21行如上所示承绸。每一個(gè)發(fā)送和接收的數(shù)據(jù)以十六進(jìn)制的形式保存起來(lái)了裸影,方便以后的分析。
如果覺(jué)得十六進(jìn)制沒(méi)啥幫助的話(huà)军熏,可以使用--trace-ascii [filename]
選項(xiàng):
$ curl --trace-ascii dump www.baidu.com
結(jié)果如下:
== Info: About to connect() to www.baidu.com port 80 (#0)
== Info: Trying 14.215.177.38... == Info: connected
== Info: Connected to www.baidu.com (14.215.177.38) port 80 (#0)
=> Send header, 166 bytes (0xa6)
0000: GET / HTTP/1.1
0010: User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7
0050: NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
0082: Host: www.baidu.com
0097: Accept: */*
00a4:
<= Recv header, 17 bytes (0x11)
0000: HTTP/1.1 200 OK
<= Recv header, 22 bytes (0x16)
0000: Accept-Ranges: bytes
<= Recv header, 76 bytes (0x4c)
0000: Cache-Control: private, no-cache, no-store, proxy-revalidate, no
0040: -transform
<= Recv header, 24 bytes (0x18)
0000: Connection: Keep-Alive
<= Recv header, 22 bytes (0x16)
0000: Content-Length: 2381
上面就是前21行的輸出轩猩。
3. Silence
verbose模式的對(duì)立模式,就是silence荡澎,可以使用-s
或--silence
選項(xiàng)來(lái)告訴curl不輸出任何程序的信息或者錯(cuò)誤信息均践,但也會(huì)輸出響應(yīng)的結(jié)果。
如果需要在有錯(cuò)誤的時(shí)候輸出錯(cuò)誤信息摩幔,可以使用-S
或--show-error
來(lái)指定彤委。
2.2 瀏覽器到curl
別人使用瀏覽器發(fā)起了一個(gè)請(qǐng)求之后,如果自己想用curl再來(lái)一次同樣的請(qǐng)求或衡,這里日常的工作中是比較常見(jiàn)的一個(gè)操作焦影。在curl中,有沒(méi)有什么比較簡(jiǎn)便快捷的方式來(lái)獲得curl命令呢薇宠?
Chrome瀏覽器和Firefox瀏覽器都實(shí)現(xiàn)了復(fù)制成curl的工具偷办,可以將瀏覽器的請(qǐng)求快速?gòu)?fù)制成curl命令艰额,非常方便快捷澄港。
1. Chrome
在Chrome中,打開(kāi)More tools->Developer模式柄沮,選擇Network選項(xiàng)卡回梧,然后就可以看到所有的請(qǐng)求废岂,選中相應(yīng)的請(qǐng)求,右鍵就有Copy as cURL
選項(xiàng)狱意,單擊就可以了湖苞。
2. Firefox
在Firefox中,打開(kāi)Web Developer->Network工具详囤,然后右鍵想要復(fù)制的鏈接财骨,就有一個(gè)Copy as cURL
的選項(xiàng),單擊就可以了藏姐。
3. HTTP與curl
與curl一起使用的協(xié)議隆箩,最多的還是HTTP,這里就將介紹如何有效地使用curl來(lái)發(fā)送HTTP請(qǐng)求羔杨。
3.1 HTTP方法
在每一個(gè)HTTP請(qǐng)求中捌臊,都有一個(gè)對(duì)應(yīng)的方法,常用的方法有:GET
兜材、POST
理澎、HEAD
和PUT
。
如果在一個(gè)curl命令中不指定具體的方法曙寡,那么默認(rèn)的就是使用GET
方法糠爬。對(duì)于其它的方法,可以在curl命令中指定:
method | option |
---|---|
POST |
-d 或-F
|
HEAD |
-I |
PUT |
-T |
3.2 Header
在curl中卵皂,使用-i
選項(xiàng)可以顯示Response的Header信息秩铆,連同Body數(shù)據(jù):
$ curl -i www.baidu.com
結(jié)果:
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: Keep-Alive
Content-Length: 2381
Content-Type: text/html
Date: Mon, 17 Sep 2018 10:26:42 GMT
Etag: "588604dd-94d"
Last-Modified: Mon, 23 Jan 2017 13:27:57 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta
http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=styleshee
t type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就
知道</title></head> <body link=#0000cc> ... </body> </html>
使用-I
選項(xiàng)可以只顯示Response的Header信息:
$ curl -I www.baidu.com
3.3 POST
POST
是HTTP中向服務(wù)端提交數(shù)據(jù)的一種方法灯变。在瀏覽器中殴玛,但在表單中填寫(xiě)完數(shù)據(jù)后,瀏覽器就會(huì)默認(rèn)將填寫(xiě)的數(shù)據(jù)使用key=value
串的形式進(jìn)行轉(zhuǎn)化添祸。在curl中滚粟,我們可以使用-d
或--data
選項(xiàng)來(lái)指定具體的數(shù)據(jù):
$ curl -d key1=value1&key2=value2 http://example.com
我們也可以使用多個(gè)-d
選項(xiàng)來(lái)指定多組數(shù)據(jù),curl會(huì)自動(dòng)把這些數(shù)據(jù)連接起來(lái)刃泌,因此上面的例子還可以這樣:
$ curl -d key1=value1 -d key2=value2 http://example.com
當(dāng)然凡壤,如果數(shù)據(jù)過(guò)多,我們還可以把數(shù)據(jù)放在一個(gè)文件中:
$ curl -d @filename http://example.com
1. Content-Type
當(dāng)使用POST
方法提交數(shù)據(jù)時(shí)耙替,對(duì)于提交的數(shù)據(jù)主要有如下四種形式:
-
application/x-www-form-urlencoded
:默認(rèn)的形式亚侠,即key1=value1&key2=value2
的形式; -
multipart/form-data
:使用表單上傳文件時(shí)使用這個(gè)形式俗扇; -
application/json
:提交JSON格式的數(shù)據(jù)硝烂; -
text/xml
:提交XML格式的數(shù)據(jù)。
Content-Type是一個(gè)Header铜幽,如果不指定的話(huà)滞谢,那么默認(rèn)就是使用application/x-www-form-urlencoded
形式傳輸數(shù)據(jù)串稀,當(dāng)需要使用別的形式進(jìn)行數(shù)據(jù)傳輸?shù)脑?huà),那么就需要指定這個(gè)Header:
$ curl -d '{I Am A JSON FORM}' -H 'Content-Type: application/json' http://example.com
其中狮杨,-H
就是用來(lái)指定一個(gè)具體的Header的選項(xiàng)母截,值就是key=value
的形式。當(dāng)需要指定其它的Header橄教,可以使用-H
選項(xiàng)清寇。
2. POST一個(gè)二進(jìn)制數(shù)據(jù)
在curl中,我們也可以提交一個(gè)文件护蝶,可以使用--data-binary
選項(xiàng)來(lái)指定一個(gè)文件:
$ curl --data-binary @filename http://example.com
3. 轉(zhuǎn)化成一個(gè)GET
使用-G
或-get
選項(xiàng)颗管,可以把一個(gè)POST請(qǐng)求轉(zhuǎn)化成一個(gè)GET請(qǐng)求。如果有-d
選項(xiàng)指定的參數(shù)滓走,那么curl就會(huì)把-d
后面的數(shù)據(jù)添加到URL的后面垦江,用?
連接。比如:
$ curl -d "key1=value1" -G http://example.com
得到的請(qǐng)求URL就是:
http://example.com/?key1=value1
4. URL編碼
如果使用的數(shù)據(jù)沒(méi)有編碼搅方,那么可以指定curl來(lái)幫助自己進(jìn)行編碼比吭。這時(shí)可以使用--data-urlencode
選項(xiàng)來(lái)指定。比如:
$ curl --data-urlencode "name=Alan Walker" http://example.com
5. multipart formposts
如果一個(gè)HTTP POST具有如下形式的表單:
<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="Submit">
</form>
用戶(hù)可以在Name
中填寫(xiě)名字姨涡,在File
中選擇一個(gè)文件衩藤,然后單擊Submit
按鈕提交數(shù)據(jù)。
為了可以在curl中模擬這個(gè)請(qǐng)求涛漂,我們可以使用-F
或--form
選項(xiàng)來(lái)指定數(shù)據(jù):
$ curl -F person=annonymous -F secret=@filename http://example.com/submit.cgi
在上面的表單中赏表,action
指定了這個(gè)請(qǐng)求發(fā)送到哪里;method
指定這是一個(gè)POST
請(qǐng)求匈仗;而enctype
指定了這是一個(gè)multipart formpost瓢剿。
當(dāng)執(zhí)行上面的curl命令后,curl會(huì)產(chǎn)生如下的請(qǐng)求頭:
POST /submit.cgi HTTP/1.1
Host: example.com
User-Agent: curl/7.46.0
Accept: */*
Content-Length: 313
Content-Type: multipart/form-data; boundary=------------------------d74496d66958873e
其中Content-Type
是和enctype
一致的悠轩。
當(dāng)使用-F
選項(xiàng)時(shí)间狂,默認(rèn)的Content-Type
就是multipart/form-data
,不過(guò)火架,我們也可以使用-H
進(jìn)行指定:
$ curl -F 'name=Dan' -H 'Content-Type: multipart/magic' https://example.com
6. -d
vs -F
在前面我們介紹了使用-d
構(gòu)造一個(gè)基本的POST請(qǐng)求鉴象,和-F
構(gòu)造一個(gè)multipart formpost請(qǐng)求。那么這兩個(gè)選項(xiàng)有啥區(qū)別以及什么時(shí)候使用呢何鸡?
這兩個(gè)選項(xiàng)都是把指定的數(shù)據(jù)發(fā)送到服務(wù)器上纺弊,區(qū)別在于數(shù)據(jù)傳遞的格式。大多數(shù)時(shí)候骡男,接收端來(lái)指定希望客戶(hù)端發(fā)送數(shù)據(jù)的格式淆游,客戶(hù)端不能隨意自己指定格式。
- HTML表單
當(dāng)使用HTML表單時(shí),會(huì)使用<form>
標(biāo)簽指定一個(gè)表單稽犁,這會(huì)讓瀏覽器使用POST
方法。如果標(biāo)簽中含有enctype=multipart/form-data
骚亿,這意味著使用multipart formpost方式已亥,在curl中就是使用-F
選項(xiàng)。一個(gè)典型的場(chǎng)景就是表單中含有<input type=file>
標(biāo)簽来屠。
- 不用HTML表單
POST
方法不一定非要在HTML中虑椎,在好多的service、APIs中俱笛,也可以使用POST
請(qǐng)求捆姜。
如果這些service期望使用JSON或者其它類(lèi)似的格式的數(shù)據(jù),那么這就是一個(gè)普通的POST請(qǐng)求迎膜。在curl中就可以使用-d
選項(xiàng)泥技。不過(guò)要注意-d
的默認(rèn)Content-Type是不是期望的格式,如果不是的話(huà)磕仅,可以使用-H
進(jìn)行更改珊豹。
3.4 HTTP重定向(redirect)
重定向是HTTP協(xié)議中的一個(gè)基礎(chǔ)部分。在重定向中榕订,服務(wù)器給客戶(hù)端的并不是客戶(hù)端想要的內(nèi)容店茶,而是一個(gè)車(chē)具體的指令,告訴客戶(hù)端如果想獲取想要的數(shù)據(jù)劫恒,應(yīng)該到哪里去請(qǐng)求贩幻。
但不是所有的重定向都一樣。重定向之后的請(qǐng)求使用什么方法呢两嘴?重定向多久呢丛楚?
所有的重定向都會(huì)返回Location:
的Header,來(lái)指定一個(gè)新的URL憔辫。
1. curl:redirect
在curl中鸯檬,默認(rèn)不會(huì)重定向,可以使用-L
或--location
選項(xiàng)來(lái)告訴curl重定向:
$ curl -L http://example.com
2. GET
還是POST
第一次請(qǐng)求后螺垢,服務(wù)器會(huì)告訴客戶(hù)端下一次請(qǐng)求需要使用的方法喧务。關(guān)于重定向的響應(yīng)碼如下:
Method | Permanent | Temporary |
---|---|---|
切換到GET
|
301 | 302和303 |
使用第一次請(qǐng)求的方法 | 308 | 307 |
我們可以指定curl在重定向時(shí)使用什么方法。如果我們第一次請(qǐng)求使用的不是GET
方法枉圃,重定向后也不希望curl默認(rèn)使用GET
方法功茴,那么我們可以使用--post301
,--post302
和--post303
選項(xiàng)來(lái)指定。
3.5 修改HTTP請(qǐng)求
每一個(gè)請(qǐng)求都有一個(gè)請(qǐng)求行孽亲、一些請(qǐng)求頭和可選的請(qǐng)求體坎穿,這里我們看看在curl中可以具體修改的部分,包括請(qǐng)求行和請(qǐng)求頭。
1. 請(qǐng)求方法
在請(qǐng)求行中包含這次請(qǐng)求所使用的方法玲昧。我們使用下面的簡(jiǎn)單命令就可以進(jìn)行一個(gè)GET
方法:
$ curl http://example.com/file
這會(huì)生成如下的請(qǐng)求行:
GET /file HTTP/1.1
在HTTP方法中我們可以通過(guò)具體的選項(xiàng)指定使用什么方法栖茉。這里我們也可以使用-X
選項(xiàng)來(lái)進(jìn)行指定:
$ curl -X POST http://example.com
2. 修改請(qǐng)求頭
在curl中,我們可以使用-H
或--header
選項(xiàng)來(lái)指定Header孵延。之前我們就使用-H
指定了Content-Type
吕漂,其實(shí)Header就是一個(gè)key: value
對(duì):
$ curl -H "HeaderName: HeaderValue" http://example.com
3. Referer
我們還可以在curl通過(guò)--referer
選項(xiàng)來(lái)指定我們是從哪里跳轉(zhuǎn)過(guò)來(lái)的:
$ curl --referer http://fromexample.com http://toexample.com
4. User Agent
這個(gè)字段是用來(lái)表示客戶(hù)端的設(shè)備信息的,服務(wù)器會(huì)根據(jù)這個(gè)字段尘应,針對(duì)不同的設(shè)備惶凝,返回不同格式的網(wǎng)頁(yè)。在curl中犬钢,可以使用--user-agent
選的來(lái)指定:
$ curl --user-agent "[User Agent]" http://example.com
3.6 Cookies
HTTP是一種無(wú)狀態(tài)的協(xié)議苍鲜,為了在會(huì)話(huà)中保存一些狀態(tài),可以使用Cookies玷犹。服務(wù)器通過(guò)Set-Cookie:
來(lái)設(shè)置Cookie混滔,客戶(hù)端就可以在下一次請(qǐng)求中攜帶這些數(shù)據(jù)。
1. 設(shè)置Cookie
我們可以使用--cookie
選項(xiàng)來(lái)設(shè)置一個(gè)Cookie:
$ curl --cookie "CookieName=CookieValue" http://example.com
2. 從文件中讀取Cookies
curl默認(rèn)不會(huì)記住服務(wù)器設(shè)置的Cookie歹颓,也不會(huì)在下一次請(qǐng)求中攜帶Cookie遍坟。除非用戶(hù)通過(guò)選項(xiàng)自己設(shè)置。
我們可以把之前的Cookies保存到一個(gè)文件晴股,然后在下一次請(qǐng)求中指定curl讀取文件中的Cookies:
$ curl -b cookies.txt http://example.com
-b
選項(xiàng)指定curl去給定的文件中讀取Cookies愿伴。
不過(guò)要主要,這里僅僅是讀取Cookies电湘,如果這次請(qǐng)求中服務(wù)器修改了Cookie隔节,那么curl是不會(huì)進(jìn)行保存的,除非我們手動(dòng)指定寂呛。
3. 寫(xiě)Cookies到文件
我們可以使用-c
選項(xiàng)指定curl保存這次請(qǐng)求中服務(wù)器設(shè)置的Cookies:
$ curl -c cookie.jar.txt http://example.com
有時(shí)怎诫,我們既需要從文件中讀取Cookies,也需要保存服務(wù)器設(shè)置的Cookies贷痪。那么就可以同時(shí)使用-b
和-c
選項(xiàng):
$ curl -b cookies.txt -c cookie.jar.txt http://example.com