curl使用指南

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ù),剩下的字符,youOK?會(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)的方法,常用的方法有:GETPOST、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ù)的一種方法。在瀏覽器中,但在表單中填寫完數(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評(píng)論 19 139
  • 轉(zhuǎn)載自:http://www.cnblogs.com/txw1958/archive/2013/01/19/286...
    php_bruce閱讀 2,465評(píng)論 1 5
  • 從上?;氐胶侠霞遥雎L(zhǎng)的火車,旁邊大叔一個(gè)勁兒打呼嚕,縮在狹小的車床上,盯著外面忽明忽暗變換不同的場(chǎng)景,天亮了...
    搗蛋派詩(shī)人閱讀 270評(píng)論 2 1
  • 學(xué)習(xí)兒童禮儀是教會(huì)孩子一種生活方式,一種生活習(xí)慣,是培養(yǎng)孩子的感恩心恭敬心??尊重心,你看到的不止是行為的變化,而...
    阿連格格閱讀 936評(píng)論 0 0
  • 我是來自深圳的一個(gè)不知名的小編劇。當(dāng)時(shí)入這行,也純屬誤打誤撞:在我做第一份游戲文案工作3年之后,我決定要找一份能原...
    203031186c1c閱讀 5,379評(píng)論 29 77

友情鏈接更多精彩內(nèi)容