curl使用指南

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ù)宋欺,剩下的字符,youOK?會(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理澎、HEADPUT

如果在一個(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末幻妓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子劫拢,更是在濱河造成了極大的恐慌肉津,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舱沧,死亡現(xiàn)場(chǎng)離奇詭異妹沙,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)熟吏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)酝豪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人牵舵,你說(shuō)我怎么就攤上這事《髦” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵趣斤,是天一觀的道長(zhǎng)俩块。 經(jīng)常有香客問(wèn)我,道長(zhǎng)唬渗,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任奋渔,我火速辦了婚禮镊逝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嫉鲸。我一直安慰自己撑蒜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布玄渗。 她就那樣靜靜地躺著座菠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪藤树。 梳的紋絲不亂的頭發(fā)上浴滴,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音岁钓,去河邊找鬼升略。 笑死,一個(gè)胖子當(dāng)著我的面吹牛屡限,可吹牛的內(nèi)容都是我干的品嚣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼钧大,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼翰撑!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起啊央,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤眶诈,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后瓜饥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體册养,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年压固,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了球拦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖坎炼,靈堂內(nèi)的尸體忽然破棺而出愧膀,到底是詐尸還是另有隱情,我是刑警寧澤谣光,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布檩淋,位于F島的核電站,受9級(jí)特大地震影響萄金,放射性物質(zhì)發(fā)生泄漏蟀悦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一氧敢、第九天 我趴在偏房一處隱蔽的房頂上張望日戈。 院中可真熱鬧,春花似錦孙乖、人聲如沸浙炼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)弯屈。三九已至,卻和暖如春恋拷,著一層夾襖步出監(jiān)牢的瞬間资厉,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工蔬顾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酌住,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓阎抒,卻偏偏與公主長(zhǎng)得像酪我,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子且叁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理都哭,服務(wù)發(fā)現(xiàn),斷路器逞带,智...
    卡卡羅2017閱讀 134,667評(píng)論 18 139
  • 轉(zhuǎn)載自:http://www.cnblogs.com/txw1958/archive/2013/01/19/286...
    php_bruce閱讀 2,275評(píng)論 1 5
  • 從上浩劢茫回到湖南老家,做漫長(zhǎng)的火車(chē)展氓,旁邊大叔一個(gè)勁兒打呼嚕穆趴,縮在狹小的車(chē)床上,盯著外面忽明忽暗變換不同的場(chǎng)景遇汞,天亮了...
    搗蛋派詩(shī)人閱讀 243評(píng)論 2 1
  • 學(xué)習(xí)兒童禮儀是教會(huì)孩子一種生活方式未妹,一種生活習(xí)慣簿废,是培養(yǎng)孩子的感恩心恭敬心??尊重心,你看到的不止是行為的變化络它,而...
    阿連格格閱讀 872評(píng)論 0 0
  • 我是來(lái)自深圳的一個(gè)不知名的小編劇族檬。當(dāng)時(shí)入這行,也純屬誤打誤撞:在我做第一份游戲文案工作3年之后化戳,我決定要找一份能原...
    203031186c1c閱讀 4,981評(píng)論 29 77