curl是一個(gè)命令行工具,通過指定的URL來上傳或下載數(shù)據(jù),并將數(shù)據(jù)展示出來。curl中的c表示client,而URL,就是URL。這里我們介紹一下curl的使用。
1. 命令行基礎(chǔ)
1.1 命令行選項(xiàng)
1. 短形式
在curl中可以使用短形式的命令行選項(xiàng),比如通知curl打開verbose模式,可以使用-v選項(xiàng):
$ curl -v www.baidu.com
這里,-v就是短形式的選項(xiàng),我們使用一個(gè)中劃線(-)并緊跟著一個(gè)字母來指定一個(gè)短形式的選項(xiàng)。
在這個(gè)例子中,-v就像一個(gè)開關(guān)一樣,指定某個(gè)變量是false還是true。我們可以在一個(gè)中劃線后面跟多個(gè)單字母的選項(xiàng):
$ curl -vL www.baidu.com
在curl中,命令行解析器總是解析整個(gè)命令行,因此,選項(xiàng)可以放在整個(gè)命令行的任何位置:
$ curl www.baidu.com -vL
這個(gè)和上面的命令具有同樣的效果。當(dāng)然,雖然是任何位置,但不能放在curl前面?。?/p>
$ -vL curl www.baidu.com // No command '-vL' found
2. 長(zhǎng)形式
單個(gè)字母的選項(xiàng)敲起來和用起來都很方便,但是字母的個(gè)數(shù)有限而需要控制的東西又太多,這個(gè)時(shí)候就可以使用選項(xiàng)的長(zhǎng)形式。同樣,為了使得命令便于閱讀,絕大多數(shù)短形式都有一個(gè)對(duì)應(yīng)的長(zhǎng)形式。
和短形式不同的是,長(zhǎng)形式的選項(xiàng)使用兩個(gè)中劃線(--)指定,然后緊跟著具體的選項(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來說,對(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類型的標(biāo)志位,來告訴curl打開或關(guān)閉某些特征。curl還有一種類型的選項(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ù)括起來:
$ curl -A "Are you OK?" http://example.com
如果不加引號(hào)的話:
$ curl -A Are you OK? http://example.com
那么curl只會(huì)把Are當(dāng)做用戶的參數(shù),剩下的字符,you和OK?會(huì)被curl當(dāng)做額外的URL處理,因?yàn)檫@里并沒有用-指定這是一個(gè)選項(xiàng)。
但是如果參數(shù)本身有引號(hào)的時(shí)候怎么辦?這在使用JSON傳遞參數(shù)的時(shí)候尤其常見,我們可以使用單引號(hào)把參數(shù)括起來(不過在Windows中不管用):
$ curl -d '{"name":"fool"}' http://example.com
當(dāng)數(shù)據(jù)很多時(shí),我們可以指定一個(gè)文件,來傳遞給curl:
$ curl -d @params.json http://example.com
5. Say No
對(duì)于像-t和-L之類的標(biāo)志選項(xiàng),我們可以在長(zhǎng)形式的前面加上no-前綴來指定關(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)來的URL做簡(jiǎn)單的驗(yàn)證,而不會(huì)去驗(yàn)證URL是否真正有效,因此,這里需要使用者提供有效的URL。
前面說過,curl首先解析整個(gè)命令行,將得到選項(xiàng)應(yīng)用于所有的URL上。如果想對(duì)每一個(gè)URL使用不同的選項(xiàng),那么可以使用--next來指定。比如:
$ curl --location http://example.com/1
--next --data sendthis http://example.com/2
--next head http://example.com/3
1. 配置文件
如果選項(xiàng)過多,導(dǎo)致命令很難輸入,或者超過了系統(tǒng)命令最大長(zhǎng)度的限制,我們可以使用配置文件(config file)來指定curl的選項(xiàng)。
通過使用-K或--config選項(xiàng)來告訴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è)中劃線(--):
# 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)也可以寫作:
# ask curl to change the User-Agent in HTTP header
user-agent = "something-is-an-agent"
甚至可以省略沒有空格的參數(shù)的引號(hào):
# ask curl to change the User-Agent in HTTP header
user-agent = something-is-an-agent
當(dāng)然,如果參數(shù)中有空格的話就不能省略引號(hào)了。
2. 開始使用curl
在前面我們簡(jiǎn)單地介紹了什么是curl以及一些基礎(chǔ)的命令行知識(shí)。我們通過命令行的方式將需要處理的URL交給curl去處理。
在這里,我們開始著手使用curl,了解curl能做什么以及如何去做。
2.1 Verbose模式
如果curl得到的結(jié)果不是期望的結(jié)果,我們可以使用-v或--verbose進(jìn)入Verbose模式獲取更多的信息。
1. 查看通信過程
在Verbose模式中,curl會(huì)得到更多的對(duì)話式信息,幫助我們了解發(fā)生了什么。curl會(huì)在每一個(gè)信息前面加上*進(jìn)行標(biāo)識(shí)。在下面的例子中,我們將百度的首頁(yè)保存下來(使用-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: */*
>
接下來是數(shù)據(jù)的傳輸過程。然后就是響應(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ì)的信息
如果覺得使用-v的信息還不夠的話,還可以使用--trace [filename]選項(xiàng)來講完整的流保存到filename中。比如:
$ curl --trace dump www.baidu.com
之后,就可以發(fā)現(xiàn)一個(gè)新的文件dump,里面保存著剛才那個(gè)會(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)制的形式保存起來了,方便以后的分析。
如果覺得十六進(jìn)制沒啥幫助的話,可以使用--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)來告訴curl不輸出任何程序的信息或者錯(cuò)誤信息,但也會(huì)輸出響應(yīng)的結(jié)果。
如果需要在有錯(cuò)誤的時(shí)候輸出錯(cuò)誤信息,可以使用-S或--show-error來指定。
2.2 瀏覽器到curl
別人使用瀏覽器發(fā)起了一個(gè)請(qǐng)求之后,如果自己想用curl再來一次同樣的請(qǐng)求,這里日常的工作中是比較常見的一個(gè)操作。在curl中,有沒有什么比較簡(jiǎn)便快捷的方式來獲得curl命令呢?
Chrome瀏覽器和Firefox瀏覽器都實(shí)現(xiàn)了復(fù)制成curl的工具,可以將瀏覽器的請(qǐng)求快速?gòu)?fù)制成curl命令,非常方便快捷。
1. Chrome
在Chrome中,打開More tools->Developer模式,選擇Network選項(xiàng)卡,然后就可以看到所有的請(qǐng)求,選中相應(yīng)的請(qǐng)求,右鍵就有Copy as cURL選項(xiàng),單擊就可以了。

2. Firefox
在Firefox中,打開Web Developer->Network工具,然后右鍵想要復(fù)制的鏈接,就有一個(gè)Copy as cURL的選項(xiàng),單擊就可以了。
3. HTTP與curl
與curl一起使用的協(xié)議,最多的還是HTTP,這里就將介紹如何有效地使用curl來發(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ù)的一種方法。在瀏覽器中,但在表單中填寫完數(shù)據(jù)后,瀏覽器就會(huì)默認(rèn)將填寫的數(shù)據(jù)使用key=value串的形式進(jìn)行轉(zhuǎn)化。在curl中,我們可以使用-d或--data選項(xiàng)來指定具體的數(shù)據(jù):
$ curl -d key1=value1&key2=value2 http://example.com
我們也可以使用多個(gè)-d選項(xiàng)來指定多組數(shù)據(jù),curl會(huì)自動(dòng)把這些數(shù)據(jù)連接起來,因此上面的例子還可以這樣:
$ curl -d key1=value1 -d key2=value2 http://example.com
當(dāng)然,如果數(shù)據(jù)過多,我們還可以把數(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,如果不指定的話,那么默認(rèn)就是使用application/x-www-form-urlencoded形式傳輸數(shù)據(jù),當(dāng)需要使用別的形式進(jìn)行數(shù)據(jù)傳輸?shù)脑?,那么就需要指定這個(gè)Header:
$ curl -d '{I Am A JSON FORM}' -H 'Content-Type: application/json' http://example.com
其中,-H就是用來指定一個(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)來指定一個(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ù)沒有編碼,那么可以指定curl來幫助自己進(jìn)行編碼。這時(shí)可以使用--data-urlencode選項(xiàng)來指定。比如:
$ 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>
用戶可以在Name中填寫名字,在File中選擇一個(gè)文件,然后單擊Submit按鈕提交數(shù)據(jù)。
為了可以在curl中模擬這個(gè)請(qǐng)求,我們可以使用-F或--form選項(xiàng)來指定數(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,不過,我們也可以使用-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í)候,接收端來指定希望客戶端發(fā)送數(shù)據(jù)的格式,客戶端不能隨意自己指定格式。
- 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或者其它類似的格式的數(shù)據(jù),那么這就是一個(gè)普通的POST請(qǐng)求。在curl中就可以使用-d選項(xiàng)。不過要注意-d的默認(rèn)Content-Type是不是期望的格式,如果不是的話,可以使用-H進(jìn)行更改。
3.4 HTTP重定向(redirect)
重定向是HTTP協(xié)議中的一個(gè)基礎(chǔ)部分。在重定向中,服務(wù)器給客戶端的并不是客戶端想要的內(nèi)容,而是一個(gè)車具體的指令,告訴客戶端如果想獲取想要的數(shù)據(jù),應(yīng)該到哪里去請(qǐng)求。
但不是所有的重定向都一樣。重定向之后的請(qǐng)求使用什么方法呢?重定向多久呢?
所有的重定向都會(huì)返回Location:的Header,來指定一個(gè)新的URL。
1. curl:redirect
在curl中,默認(rèn)不會(huì)重定向,可以使用-L或--location選項(xiàng)來告訴curl重定向:
$ curl -L http://example.com
2. GET還是POST
第一次請(qǐng)求后,服務(wù)器會(huì)告訴客戶端下一次請(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)來指定。
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方法中我們可以通過具體的選項(xiàng)指定使用什么方法。這里我們也可以使用-X選項(xiàng)來進(jìn)行指定:
$ curl -X POST http://example.com
2. 修改請(qǐng)求頭
在curl中,我們可以使用-H或--header選項(xiàng)來指定Header。之前我們就使用-H指定了Content-Type,其實(shí)Header就是一個(gè)key: value對(duì):
$ curl -H "HeaderName: HeaderValue" http://example.com
3. Referer
我們還可以在curl通過--referer選項(xiàng)來指定我們是從哪里跳轉(zhuǎn)過來的:
$ curl --referer http://fromexample.com http://toexample.com
4. User Agent
這個(gè)字段是用來表示客戶端的設(shè)備信息的,服務(wù)器會(huì)根據(jù)這個(gè)字段,針對(duì)不同的設(shè)備,返回不同格式的網(wǎng)頁(yè)。在curl中,可以使用--user-agent選的來指定:
$ curl --user-agent "[User Agent]" http://example.com
3.6 Cookies
HTTP是一種無狀態(tài)的協(xié)議,為了在會(huì)話中保存一些狀態(tài),可以使用Cookies。服務(wù)器通過Set-Cookie:來設(shè)置Cookie,客戶端就可以在下一次請(qǐng)求中攜帶這些數(shù)據(jù)。
1. 設(shè)置Cookie
我們可以使用--cookie選項(xiàng)來設(shè)置一個(gè)Cookie:
$ curl --cookie "CookieName=CookieValue" http://example.com
2. 從文件中讀取Cookies
curl默認(rèn)不會(huì)記住服務(wù)器設(shè)置的Cookie,也不會(huì)在下一次請(qǐng)求中攜帶Cookie。除非用戶通過選項(xiàng)自己設(shè)置。
我們可以把之前的Cookies保存到一個(gè)文件,然后在下一次請(qǐng)求中指定curl讀取文件中的Cookies:
$ curl -b cookies.txt http://example.com
-b選項(xiàng)指定curl去給定的文件中讀取Cookies。
不過要主要,這里僅僅是讀取Cookies,如果這次請(qǐng)求中服務(wù)器修改了Cookie,那么curl是不會(huì)進(jìn)行保存的,除非我們手動(dòng)指定。
3. 寫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