curl命令常見用法匯總 good


 

curl是一種命令行工具,作用是發出網絡請求,然后得到和提取數據,顯示在"標准輸出"(stdout)上面。

curl是一個強大的命令行工具,它可以通過網絡將信息傳遞給服務器或者從服務器獲取數據。他支持很多的傳輸協議,尤其是HTTP/HTTPS以及其他諸如FTP/FTPS, RTSP, POP3/POP3S, SCP, IMAP/IMAPS協議等。當你使用curl向一個URL發送HTTP請求的時候,它會使用一個默認只包含必要的頭部字段(如:User-Agent, Host, and Accept)的HTTP頭。

--header 等價於 -H

-H/--header <header>
(HTTP) Extra header to use when getting a web page. You may specify any number of extra headers. Note that if you should add a custom header that has the same name as one of the internal ones curl
would use, your externally set header will be used instead of the internal one. This allows you to make even trickier stuff than curl would normally do. You should not replace internally set headers
without knowing perfectly well what you鈥檙e doing. Remove an internal header by giving a replacement without content on the right side of the colon

-d/--data <data>
(HTTP) Sends the specified data in a POST request to the HTTP server, in the same way that a browser does when a user has filled in an HTML form and presses the submit button. This will cause curl
to pass the data to the server using the content-type application/x-www-form-urlencoded.

-X/--request <command>
(HTTP) Specifies a custom request method to use when communicating with the HTTP server. The specified request will be used instead of the method otherwise used (which defaults to GET). Read the
HTTP 1.1 specification for details and explanations. Common additional HTTP requests include PUT and DELETE, but related technologies like WebDAV offers PROPFIND, COPY, MOVE and more.

(FTP) Specifies a custom FTP command to use instead of LIST when doing file lists with FTP.

If this option is used several times, the last one will be used.

curl -X POST  \
--header 'Content-Type: application/json' \
--header 'Accept: application/json'  \
--header 'appkey:key'  \
--header 'appsign=sign'  \
--header 'signmethod:md5'  \
--header 'deviceType:1'  \
--header 'deviceId:1'  \
-d '{"city":"shanghai","country":"China","headimg":"https://1.com/1.png","nick":"123","openid":"xxxxx","province":"Shanghai","sex":1,"unionid":"om-xxxxxx"}' \
'https://chaojihao.net/user/transfer'

 

https://linux.cn/article-4957-1.html

如果測試api接口,不想看到中間過程:
curl -s  http://url/api

一、查看網頁源碼

直接在curl命令后加上網址,就可以看到網頁源碼。我們以網址www.sina.com為例(選擇該網址,主要因為它的網頁代碼較短):

  $ curl www.sina.com

  <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
  <html><head>
  <title>301 Moved Permanently</title>
  </head><body>
  <h1>Moved Permanently</h1>
  <p>The document has moved <a href="http://www.sina.com.cn/">here</a>.</p>
  </body></html>

如果要把這個網頁保存下來,可以使用`-o`參數,這就相當於使用wget命令了。

  $ curl -o [文件名] www.sina.com

二、自動跳轉

有的網址是自動跳轉的。使用`-L`參數,curl就會跳轉到新的網址。

  $ curl -L www.sina.com

鍵入上面的命令,結果就自動跳轉為www.sina.com.cn。

三、顯示頭信息

`-i`參數可以顯示http response的頭信息,連同網頁代碼一起。

  $ curl -i www.sina.com

  HTTP/1.0 301 Moved Permanently
  Date: Sat, 03 Sep 2011 23:44:10 GMT
  Server: Apache/2.0.54 (Unix)
  Location: http://www.sina.com.cn/
  Cache-Control: max-age=3600
  Expires: Sun, 04 Sep 2011 00:44:10 GMT
  Vary: Accept-Encoding
  Content-Length: 231
  Content-Type: text/html; charset=iso-8859-1
  Age: 3239
  X-Cache: HIT from sh201-9.sina.com.cn
  Connection: close

  <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
  <html><head>
  <title>301 Moved Permanently</title>
  </head><body>
  <h1>Moved Permanently</h1>
  <p>The document has moved <a href="http://www.sina.com.cn/">here</a>.</p>
  </body></html>

`-I`參數則是只顯示http response的頭信息。

四、顯示通信過程

`-v`參數可以顯示一次http通信的整個過程,包括端口連接和http request頭信息。

  $ curl -v www.sina.com

  * About to connect() to www.sina.com port 80 (#0)
  * Trying 61.172.201.195... connected
  * Connected to www.sina.com (61.172.201.195) port 80 (#0)
  > GET / HTTP/1.1
  > User-Agent: curl/7.21.3 (i686-pc-linux-gnu) libcurl/7.21.3 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
  > Host: www.sina.com
  > Accept: */*
  > 
  * HTTP 1.0, assume close after body
  < HTTP/1.0 301 Moved Permanently
  < Date: Sun, 04 Sep 2011 00:42:39 GMT
  < Server: Apache/2.0.54 (Unix)
  < Location: http://www.sina.com.cn/
  < Cache-Control: max-age=3600
  < Expires: Sun, 04 Sep 2011 01:42:39 GMT
  < Vary: Accept-Encoding
  < Content-Length: 231
  < Content-Type: text/html; charset=iso-8859-1
  < X-Cache: MISS from sh201-19.sina.com.cn
  < Connection: close
  < 
  <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
  <html><head>
  <title>301 Moved Permanently</title>
  </head><body>
  <h1>Moved Permanently</h1>
  <p>The document has moved <a href="http://www.sina.com.cn/">here</a>.</p>
  </body></html>
  * Closing connection #0

如果你覺得上面的信息還不夠,那么下面的命令可以查看更詳細的通信過程。

  $ curl --trace output.txt www.sina.com

或者

  $ curl --trace-ascii output.txt www.sina.com

運行后,請打開output.txt文件查看。

五、發送表單信息

發送表單信息有GET和POST兩種方法。GET方法相對簡單,只要把數據附在網址后面就行。

  $ curl example.com/form.cgi?data=xxx

POST方法必須把數據和網址分開,curl就要用到--data參數。

  $ curl -X POST --data "data=xxx" example.com/form.cgi

如果你的數據沒有經過表單編碼,還可以讓curl為你編碼,參數是`--data-urlencode`。

  $ curl -X POST--data-urlencode "date=April 1" example.com/form.cgi

六、HTTP動詞

curl默認的HTTP動詞是GET,使用`-X`參數可以支持其他動詞。

  $ curl -X POST www.example.com

  $ curl -X DELETE www.example.com

七、文件上傳

In my opinion the best tool for such testing is curl. Its --upload-file option uploads a file by PUT, which is exactly what you want (and it can do much more, like modifying HTTP headers, in case you need it):

curl http://myservice --upload-file file.txt

http://stackoverflow.com/questions/5143915/test-file-upload-using-http-put-method
統計上傳文件耗時:

curl  -w  %{time_total}s  http://myservice --upload-file file.txt

curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total}:%{time_namelookup}:%{speed_download} http://url.com/api

time_connect:建立到服務器的TCP連接所用的時間
time_starttransfer:在發出請求后,web服務器返回數據的第一個字節所用的時間
time_total:完成請求所用的時間
time_namelookup:DNS解析時間,從請求開始到DNS解析完畢所用時間(記得關掉Linux的nscd的服務測試)
speed_download:下載速度,單位字節每秒

另外可以配合

time wget http://url.com/api
進一步測試。

https://kikoroc.com/2016/05/04/check-url-costtime-via-curl.html

 

 

假定文件上傳的表單是下面這樣:

  <form method="POST" enctype='multipart/form-data' action="upload.cgi">
    <input type=file name=upload>
    <input type=submit name=press value="OK">
  </form>

你可以用curl這樣上傳文件:

  $ curl --form upload=@localfilename --form press=OK [URL]

八、Referer字段

有時你需要在http request頭信息中,提供一個referer字段,表示你是從哪里跳轉過來的。

  $ curl --referer http://www.example.com http://www.example.com

九、User Agent字段

這個字段是用來表示客戶端的設備信息。服務器有時會根據這個字段,針對不同設備,返回不同格式的網頁,比如手機版和桌面版。

iPhone4的User Agent是

  Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7

curl可以這樣模擬:

  $ curl --user-agent "[User Agent]" [URL]

十、cookie

使用`--cookie`參數,可以讓curl發送cookie。

  $ curl --cookie "name=xxx" www.example.com

至於具體的cookie的值,可以從http response頭信息的`Set-Cookie`字段中得到。

`-c cookie-file`可以保存服務器返回的cookie到文件,`-b cookie-file`可以使用這個文件作為cookie信息,進行后續的請求。

  $ curl -c cookies http://example.com
  $ curl -b cookies http://example.com

十一、增加頭信息

有時需要在http request之中,自行增加一個頭信息。`--header`參數就可以起到這個作用。

  $ curl --header "Content-Type:application/json" http://example.com

為了解決所有這些問題,curl提供了一個簡單的方法來完全控制傳出HTTP請求的HTTP頭。你需要的這個參數是“-H” 或者 “--header”。

為了定義多個HTTP頭部字段,"-H"選項可以在curl命令中被多次指定。

在一些個例中,或許你想要在一個HTTP請求中覆蓋掉默認的HTTP頭或者添加一個新的自定義頭部字段。例如,你或許想要重寫“HOST”字段來測試一個負載均衡,或者通過重寫"User-Agent"字符串來假冒特定瀏覽器以解決一些訪問限制的問題。

為了解決所有這些問題,curl提供了一個簡單的方法來完全控制傳出HTTP請求的HTTP頭。你需要的這個參數是“-H” 或者 “--header”。

為了定義多個HTTP頭部字段,"-H"選項可以在curl命令中被多次指定。

例如:以下命令設置了3個HTTP頭部字段。也就是說,重寫了“HOST”字段,並且添加了兩個字段("Accept-Language" 和 "Cookie")

  1. $ curl -H 'Host: 157.166.226.25' -H 'Accept-Language: es' -H 'Cookie: ID=1234' http://cnn.com

對於"User-Agent", "Cookie", "Host"這類標准的HTTP頭部字段,通常會有另外一種設置方法。curl命令提供了特定的選項來對這些頭部字段進行設置:

  • -A (or --user-agent): 設置 "User-Agent" 字段.
  • -b (or --cookie): 設置 "Cookie" 字段.
  • -e (or --referer): 設置 "Referer" 字段.

例如,以下兩個命令是等效的。這兩個命令同樣都對HTTP頭的"User-Agent"字符串進行了更改。

  1. $ curl -H "User-Agent: my browser" http://cnn.com
  2. $ curl -A "my browser" http://cnn.com

wget是另外一個類似於curl,可以用來獲取URL的命令行工具。並且wget也一樣允許你使用一個自定義的HTTP頭。點擊這里查看wget命令的詳細信息。

十二、HTTP認證

有些網域需要HTTP認證,這時curl需要用到`--user`參數。

  $ curl --user name:password example.com

【參考資料】

  * Using cURL to automate HTTP jobs

  * 教你學用CURL

  * 9 uses for cURL worth knowing

http://www.ruanyifeng.com/blog/2011/09/curl.html

 

Linux curl命令是一個利用URL規則在命令行下工作的文件傳輸工具。它支持文件的上傳和下載,所以是綜合傳輸工具,但按傳統,習慣稱curl為下載工具。作為一款強力工具,curl支持包括HTTP、HTTPS、FTP等眾多協議,還支持POST、cookies、認證、從指定偏移處下載部分文件、用戶代理字符串、限速、文件大小、進度條等特征。做網頁處理流程和數據檢索自動化,curl可以祝一臂之力。

curl命令選項

-a/--append 上傳文件時,附加到目標文件
-A/--user-agent <string> 設置用戶代理發送給服務器
-anyauth 可以使用“任何”身份驗證方法
-b/--cookie <name=string/file> cookie字符串或文件讀取位置
     --basic 使用HTTP基本驗證
-B/--use-ascii 使用ASCII /文本傳輸
-c/--cookie-jar <file> 操作結束后把cookie寫入到這個文件中
-C/--continue-at <offset> 斷點續轉
-d/--data <data> HTTP POST方式傳送數據
     --data-ascii <data> 以ascii的方式post數據
     --data-binary <data> 以二進制的方式post數據
     --negotiate 使用HTTP身份驗證
     --digest 使用數字身份驗證
     --disable-eprt 禁止使用EPRT或LPRT
     --disable-epsv 禁止使用EPSV
-D/--dump-header <file> 把header信息寫入到該文件中
     --egd-file <file> 為隨機數據(SSL)設置EGD socket路徑
     --tcp-nodelay 使用TCP_NODELAY選項
-e/--referer 來源網址
-E/--cert <cert[:passwd]> 客戶端證書文件和密碼 (SSL)
     --cert-type <type> 證書文件類型 (DER/PEM/ENG) (SSL)
     --key <key> 私鑰文件名 (SSL)
     --key-type <type> 私鑰文件類型 (DER/PEM/ENG) (SSL)
     --pass <pass> 私鑰密碼 (SSL)
     --engine <eng> 加密引擎使用 (SSL). "--engine list" for list
     --cacert <file> CA證書 (SSL)
     --capath <directory> CA目錄 (made using c_rehash) to verify peer against (SSL)
     --ciphers <list> SSL密碼
     --compressed 要求返回是壓縮的形勢 (using deflate or gzip)
     --connect-timeout <seconds> 設置最大請求時間
     --create-dirs 建立本地目錄的目錄層次結構
     --crlf 上傳是把LF轉變成CRLF
-f/--fail 連接失敗時不顯示http錯誤
     --ftp-create-dirs 如果遠程目錄不存在,創建遠程目錄
     --ftp-method [multicwd/nocwd/singlecwd] 控制CWD的使用
     --ftp-pasv 使用 PASV/EPSV 代替端口
     --ftp-skip-pasv-ip 使用PASV的時候,忽略該IP地址
     --ftp-ssl 嘗試用 SSL/TLS 來進行ftp數據傳輸
     --ftp-ssl-reqd 要求用 SSL/TLS 來進行ftp數據傳輸
-F/--form <name=content> 模擬http表單提交數據
     --form-string <name=string> 模擬http表單提交數據
-g/--globoff 禁用網址序列和范圍使用{}和[]
-G/--get 以get的方式來發送數據
-H/--header <line> 自定義頭信息傳遞給服務器
     --ignore-content-length 忽略的HTTP頭信息的長度
-i/--include 輸出時包括protocol頭信息
-I/--head 只顯示請求頭信息
-j/--junk-session-cookies 讀取文件進忽略session cookie
     --interface <interface> 使用指定網絡接口/地址
     --krb4 <level> 使用指定安全級別的krb4
-k/--insecure 允許不使用證書到SSL站點
-K/--config 指定的配置文件讀取
-l/--list-only 列出ftp目錄下的文件名稱
     --limit-rate <rate> 設置傳輸速度
     --local-port<NUM> 強制使用本地端口號
-m/--max-time <seconds> 設置最大傳輸時間
     --max-redirs <num> 設置最大讀取的目錄數
     --max-filesize <bytes> 設置最大下載的文件總量
-M/--manual 顯示全手動
-n/--netrc 從netrc文件中讀取用戶名和密碼
     --netrc-optional 使用 .netrc 或者 URL來覆蓋-n
     --ntlm 使用 HTTP NTLM 身份驗證
-N/--no-buffer 禁用緩沖輸出
-o/--output 把輸出寫到該文件中
-O/--remote-name 把輸出寫到該文件中,保留遠程文件的文件名
-p/--proxytunnel 使用HTTP代理
     --proxy-anyauth 選擇任一代理身份驗證方法
     --proxy-basic 在代理上使用基本身份驗證
     --proxy-digest 在代理上使用數字身份驗證
     --proxy-ntlm 在代理上使用ntlm身份驗證
-P/--ftp-port <address> 使用端口地址,而不是使用PASV
-q 作為第一個參數,關閉 .curlrc
-Q/--quote <cmd> 文件傳輸前,發送命令到服務器
-r/--range <range> 檢索來自HTTP/1.1或FTP服務器字節范圍
--range-file 讀取(SSL)的隨機文件
-R/--remote-time 在本地生成文件時,保留遠程文件時間
     --retry <num> 傳輸出現問題時,重試的次數
     --retry-delay <seconds> 傳輸出現問題時,設置重試間隔時間
     --retry-max-time <seconds> 傳輸出現問題時,設置最大重試時間
-s/--silent 靜默模式。不輸出任何東西
-S/--show-error 顯示錯誤
     --socks4 <host[:port]> 用socks4代理給定主機和端口
     --socks5 <host[:port]> 用socks5代理給定主機和端口
     --stderr <file>  
-t/--telnet-option <OPT=val> Telnet選項設置
     --trace <file> 對指定文件進行debug
     --trace-ascii <file> Like --跟蹤但沒有hex輸出
     --trace-time 跟蹤/詳細輸出時,添加時間戳
-T/--upload-file <file> 上傳文件
     --url <URL> Spet URL to work with
-u/--user <user[:password]> 設置服務器的用戶和密碼
-U/--proxy-user <user[:password]> 設置代理用戶名和密碼
-w/--write-out [format] 什么輸出完成后
-x/--proxy <host[:port]> 在給定的端口上使用HTTP代理
-X/--request <command> 指定什么命令
-y/--speed-time 放棄限速所要的時間,默認為30
-Y/--speed-limit 停止傳輸速度的限制,速度時間

curl常用操作

文件下載

curl命令可以用來執行下載、發送各種HTTP請求,指定HTTP頭部等操作。如果系統沒有curl可以使用 yum install curl 安裝,也可以下載安裝。curl是將下載文件輸出到stdout,將進度信息輸出到stderr,不顯示進度信息使用 --silent 選項。

curl URL --silent

這條命令是將下載文件輸出到終端,所有下載的數據都被寫入到stdout。

使用選項 -O 將下載的數據寫入到文件,必須使用文件的絕對地址:

curl http://www.1987.name/text.iso --silent -O

選項 -o 將下載數據寫入到指定名稱的文件中,並使用 --progress 顯示進度條:

curl http://www.1987.name/test.iso -o filename.iso --progress
######################################### 100.0%

斷點續傳

curl能夠從特定的文件偏移處繼續下載,它可以通過指定一個便宜量來下載部分文件:

curl URL/File -C 偏移量

#偏移量是以字節為單位的整數,如果讓curl自動推斷出正確的續傳位置使用-C -:
curl -C -URL

使用curl設置參照頁字符串

參照頁是位於HTTP頭部中的一個字符串,用來表示用戶是從哪個頁面到達當前頁面的,如果用戶點擊網頁A中的某個連接,那么用戶就會跳轉到B網頁,網頁B頭部的參照頁字符串就包含網頁A的URL。

使用 --referer 選項指定參照頁字符串:

curl --referer http://www.google.com http://www.1987.name

用curl設置cookies

使用 --cookie "COKKIES" 選項來指定cookie,多個cookie使用分號分隔:

curl http://www.1987.name --cookie "user=root;pass=123456"

將cookie另存為一個文件,使用 --cookie-jar 選項:

curl URL --cookie-jar cookie_file

用curl設置用戶代理字符串

有些網站訪問會提示只能使用IE瀏覽器來訪問,這是因為這些網站設置了檢查用戶代理,可以使用curl把用戶代理設置為IE,這樣就可以訪問了。使用 --user-agent 或者-A 選項:

curl URL --user-agent "Mozilla/5.0"
curl URL -A "Mozilla/5.0"

其他HTTP頭部信息也可以使用curl來發送,使用 -H "頭部信息" 傳遞多個頭部信息,例如:

curl -H "Host:www.1987.name" -H "Accept-language:zh-cn" URL

curl的帶寬控制和下載配額

使用 --limit-rate 限制curl的下載速度:

curl URL --limit-rate 50k

命令中用k(千字節)和m(兆字節)指定下載速度限制。

使用 --max-filesize 指定可下載的最大文件大小:

curl URL --max-filesize bytes

如果文件大小超出限制,命令則返回一個非0退出碼,如果命令正常則返回0

用curl進行認證

使用curl選項 -u 可以完成HTTP或者FTP的認證,可以指定密碼,也可以不指定密碼在后續操作中輸入密碼:

curl -u user:pwd http://test.1987.name
curl -u user http://test.1987.name

只打印響應頭部信息

通過 -I 或者 -head 可以只打印出HTTP頭部信息:

[root@localhost text]# curl -I http://www.1987.name
HTTP/1.1 200 OK
Server: nginx/1.2.5
Date: Mon, 10 Dec 2012 09:24:34 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
X-Pingback: http://www.1987.name/xmlrpc.php

http://www.cnblogs.com/AloneSword/p/4471103.html

 

Header 解釋 示例
Accept-Ranges 表明服務器是否支持指定范圍請求及哪種類型的分段請求 Accept-Ranges: bytes
Age 從原始服務器到代理緩存形成的估算時間(以秒計,非負) Age: 12
Allow 對某網絡資源的有效的請求行為,不允許則返回405 Allow: GET, HEAD
Cache-Control 告訴所有的緩存機制是否可以緩存及哪種類型 Cache-Control: no-cache
Content-Encoding web服務器支持的返回內容壓縮編碼類型。 Content-Encoding: gzip
Content-Language 響應體的語言 Content-Language: en,zh
Content-Length 響應體的長度 Content-Length: 348
Content-Location 請求資源可替代的備用的另一地址 Content-Location: /index.htm
Content-MD5 返回資源的MD5校驗值 Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==
Content-Range 在整個返回體中本部分的字節位置 Content-Range: bytes 21010-47021/47022
Content-Type 返回內容的MIME類型 Content-Type: text/html; charset=utf-8
Date 原始服務器消息發出的時間 Date: Tue, 15 Nov 2010 08:12:31 GMT
ETag 請求變量的實體標簽的當前值 ETag: “737060cd8c284d8af7ad3082f209582d”
Expires 響應過期的日期和時間 Expires: Thu, 01 Dec 2010 16:00:00 GMT
Last-Modified 請求資源的最后修改時間 Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT
Location 用來重定向接收方到非請求URL的位置來完成請求或標識新的資源 Location: http://www.zcmhi.com/archives/94.html
Pragma 包括實現特定的指令,它可應用到響應鏈上的任何接收方 Pragma: no-cache
Proxy-Authenticate 它指出認證方案和可應用到代理的該URL上的參數 Proxy-Authenticate: Basic
refresh 應用於重定向或一個新的資源被創造,在5秒之后重定向(由網景提出,被大部分瀏覽器支持)



Refresh: 5; url=
http://www.zcmhi.com/archives/94.html
Retry-After 如果實體暫時不可取,通知客戶端在指定時間之后再次嘗試 Retry-After: 120
Server web服務器軟件名稱 Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)
Set-Cookie 設置Http Cookie Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1
Trailer 指出頭域在分塊傳輸編碼的尾部存在 Trailer: Max-Forwards
Transfer-Encoding 文件傳輸編碼 Transfer-Encoding:chunked
Vary 告訴下游代理是使用緩存響應還是從原始服務器請求 Vary: *
Via 告知代理客戶端響應是通過哪里發送的 Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
Warning 警告實體可能存在的問題 Warning: 199 Miscellaneous warning
WWW-Authenticate 表明客戶端請求實體應該使用的授權方案 WWW-Authenticate: Basic

HTTP RequestHeader信息

1HTTP請求方式

如下表:

 

 

GET

向Web服務器請求一個文件

POST

向Web服務器發送數據讓Web服務器進行處理

PUT

向Web服務器發送數據並存儲在Web服務器內部

HEAD

檢查一個對象是否存在

DELETE

從Web服務器上刪除一個文件

CONNECT

對通道提供支持

TRACE

跟蹤到服務器的路徑

OPTIONS

查詢Web服務器的性能

說明:

主要使用到“GET”和“POST”。

實例:

POST /test/tupian/cm HTTP/1.1

分成三部分:

(1)POST:HTTP請求方式

(2)/test/tupian/cm:請求Web服務器的目錄地址(或者指令)

(3)HTTP/1.1: URI(Uniform Resource Identifier,統一資源標識符)及其版本

備注:

         在Ajax中,對應method屬性設置。

2Host

說明:

請求的web服務器域名地址

實例:

例如web請求URL:http://zjm-forum-test10.zjm.baidu.com:8088/test/tupian/cm

Host就為zjm-forum-test10.zjm.baidu.com:8088

3User-Agent

說明:

HTTP客戶端運行的瀏覽器類型的詳細信息。通過該頭部信息,web服務器可以判斷到當前HTTP請求的客戶端瀏覽器類別。

實例:

    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11

4Accept

說明:

指定客戶端能夠接收的內容類型,內容類型中的先后次序表示客戶端接收的先后次序。

實例:

         例如:

Accept:text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5

備注:

在Prototyp(1.5)的Ajax代碼封裝中,將Accept默認設置為“text/javascript, text/html, application/xml, text/xml, */*”。這是因為Ajax默認獲取服務器返回的Json數據模式。

在Ajax代碼中,可以使用XMLHttpRequest 對象中setRequestHeader函數方法來動態設置這些Header信息。

5Accept-Language

說明:

    指定HTTP客戶端瀏覽器用來展示返回信息所優先選擇的語言。

實例:

Accept-Language: zh-cn,zh;q=0.5

         這里默認為中文。

6Accept-Encoding

說明:

         指定客戶端瀏覽器可以支持的web服務器返回內容壓縮編碼類型。表示允許服務器在將輸出內容發送到客戶端以前進行壓縮,以節約帶寬。而這里設置的就是客戶端瀏覽器所能夠支持的返回壓縮格式。

實例:

         Accept-Encoding: gzip,deflate

備注:

其實在百度很多產品線中,apache在給客戶端返回頁面數據之前,將數據以gzip格式進行壓縮。

另外有關deflate壓縮介紹:

http://man.chinaunix.net/newsoft/ApacheMenual_CN_2.2new/mod/mod_deflate.html

7Accept-Charset

說明:

         瀏覽器可以接受的字符編碼集。

實例:

         Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7

8Content-Type

說明:

顯示此HTTP請求提交的內容類型。一般只有post提交時才需要設置該屬性。

實例:

         Content-type: application/x-www-form-urlencoded;charset:UTF-8

有關Content-Type屬性值可以如下兩種編碼類型:

(1)“application/x-www-form-urlencoded”: 表單數據向服務器提交時所采用的編碼類型,默認的缺省值就是“application/x-www-form-urlencoded”。 然而,在向服務器發送大量的文本、包含非ASCII字符的文本或二進制數據時這種編碼方式效率很低。

(2)“multipart/form-data”: 在文件上載時,所使用的編碼類型應當是“multipart/form-data”,它既可以發送文本數據,也支持二進制數據上載。

當提交為單單數據時,可以使用“application/x-www-form-urlencoded”;當提交的是文件時,就需要使用“multipart/form-data”編碼類型。

在Content-Type屬性當中還是指定提交內容的charset字符編碼。一般不進行設置,它只是告訴web服務器post提交的數據采用的何種字符編碼。

         一般在開發過程,是由前端工程與后端UI工程師商量好使用什么字符編碼格式來post提交的,然后后端ui工程師按照固定的字符編碼來解析提交的數據。所以這里設置的charset沒有多大作用。

9Connection

說明:

表示是否需要持久連接。如果web服務器端看到這里的值為“Keep-Alive”,或者看到請求使用的是HTTP 1.1(HTTP 1.1默認進行持久連接),它就可以利用持久連接的優點,當頁面包含多個元素時(例如Applet,圖片),顯著地減少下載所需要的時間。要實現這一點, web服務器需要在返回給客戶端HTTP頭信息中發送一個Content-Length(返回信息正文的長度)頭,最簡單的實現方法是:先把內容寫入ByteArrayOutputStream,然 后在正式寫出內容之前計算它的大小。

實例:

Connection: keep-alive

10Keep-Alive

說明:

         顯示此HTTP連接的Keep-Alive時間。使客戶端到服務器端的連接持續有效,當出現對服務器的后繼請求時,Keep-Alive功能避免了建立或者重新建立連接。

         以前HTTP請求是一站式連接,從HTTP/1.1協議之后,就有了長連接,即在規定的Keep-Alive時間內,連接是不會斷開的。

實例:

Keep-Alive: 300

11cookie

說明:

         HTTP請求發送時,會把保存在該請求域名下的所有cookie值一起發送給web服務器。

12Referer

說明:

包含一個URL,用戶從該URL代表的頁面出發訪問當前請求的頁面

·服務器端返回HTTP頭部信息

1Content-Length

說明:

         表示web服務器返回消息正文的長度

2Content-Type:

說明:

         返回數據的類型(例如text/html文本類型)和字符編碼格式。

實例:

Content-Type: text/html;charset=utf-8

3Date

說明:

         顯示當前的時間


本文根據RFC2616(HTTP/1.1規范),參考

http://www.w3.org/Protocols/rfc2068/rfc2068

http://www.w3.org/Protocols/rfc2616/rfc2616

http://www.ietf.org/rfc/rfc3229.txt

通常HTTP消息包括客戶機向服務器的請求消息和服務器向客戶機的響應消息。這兩種類型的消息由一個起始行,一個或者多個頭域,一個只是頭域結束的空行和可 選的消息體組成。HTTP的頭域包括通用頭,請求頭,響應頭和實體頭四個部分。每個頭域由一個域名,冒號(:)和域值三部分組成。域名是大小寫無關的,域 值前可以添加任何數量的空格符,頭域可以被擴展為多行,在每行開始處,使用至少一個空格或制表符。 

  通用頭域 (通用首部)

通用頭域包含請求和響應消息都支持的頭域,提供了與報文相關的最基本的信息,通用頭域包含 

Connection 允許客戶端和服務器指定與請求/響應連接有關的選項

Date 提供日期和時間標志,說明報文是什么時間創建的

MIME-Version 給出發送端使用的MIME版本

Trailer 如果報文采用了分塊傳輸編碼(chunked transfer encoding) 方式,就可以用這個首部列出位於報文拖掛(trailer)部分的首部集合

Transfer-Encoding 告知接收端為了保證報文的可靠傳輸,對報文采用了什么編碼方式

Upgrade 給出了發送端可能想要"升級"使用的新版本和協議

Via 顯示了報文經過的中間節點(代理,網嘎un)

對通用頭域的擴展要求通訊雙方都支持此擴 展,如果存在不支持的通用頭域,一般將會作為實體頭域處理。下面簡單介紹幾個在UPnP消息中使用的通用頭域。 


  Cache-Control頭域 

Cache -Control指定請求和響應遵循的緩存機制。在請求消息或響應消息中設置 Cache-Control並不會修改另一個消息處理過程中的緩存處理過程。請求時的緩存指令包括no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached,響應消息中的指令包括public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。各個消息中的指令含義如 下: 

Public指示響應可被任何緩存區緩存。 

Private指示對於單個用戶的整個或部分響應消息,不能被共享緩存處理。這允許服務器僅僅描述當用戶的部分響應消息,此響應消息對於其他用戶的請求無效。 

no-cache指示請求或響應消息不能緩存 

no-store用於防止重要的信息被無意的發布。在請求消息中發送將使得請求和響應消息都不使用緩存。 

max-age指示客戶機可以接收生存期不大於指定時間(以秒為單位)的響應。 

min-fresh指示客戶機可以接收響應時間小於當前時間加上指定時間的響應。 

max-stale指示客戶機可以接收超出超時期間的響應消息。如果指定max-stale消息的值,那么客戶機可以接收超出超時期指定值之內的響應消息。 


  Date頭域 

Date頭域表示消息發送的時間,時間的描述格式由rfc822定義。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的時間表示世界標准時,換算成本地時間,需要知道用戶所在的時區。 

  Pragma頭域 

Pragma頭域用來包含實現特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1協議中,它的含義和Cache- Control:no-cache相同。 

  請求消息 

請求消息的第一行為下面的格式: 

MethodSPRequest-URISPHTTP-VersionCRLFMethod 表示對於Request-URI完成的方法,這個字段是大小寫敏感的,包括OPTIONS、GET、HEAD、POST、PUT、DELETE、 TRACE。方法GET和HEAD應該被所有的通用WEB服務器支持,其他所有方法的實現是可選的。GET方法取回由Request-URI標識的信息。 HEAD方法也是取回由Request-URI標識的信息,只是可以在響應時,不返回消息體。POST方法可以請求服務器接收包含在請求中的實體信息,可 以用於提交表單,向新聞組、BBS、郵件群組和數據庫發送消息。 

SP表示空格。Request-URI遵循URI格式,在此字段為星 號(*)時,說明請求並不用於某個特定的資源地址,而是用於服務器本身。HTTP- Version表示支持的HTTP版本,例如為HTTP/1.1。CRLF表示換行回車符。請求頭域允許客戶端向服務器傳遞關於請求或者關於客戶機的附加 信息。請求頭域可能包含下列字段Accept、Accept-Charset、Accept- Encoding、Accept-Language、Authorization、From、Host、If-Modified-Since、If- Match、If-None-Match、If-Range、If-Range、If-Unmodified-Since、Max-Forwards、 Proxy-Authorization、Range、Referer、User-Agent。對請求頭域的擴展要求通訊雙方都支持,如果存在不支持的請 求頭域,一般將會作為實體頭域處理。 

  典型的請求消息: 

GET http://download.google.com/somedata.exe 
Host: download.google.com
Accept:*/* 
Pragma: no-cache 
Cache-Control: no-cache 
Referer: http://download.google.com/ 
User-Agent:Mozilla/4.04[en](Win95;I;Nav) 
Range:bytes=554554- 

上例第一行表示HTTP客戶端(可能是瀏覽器、下載程序)通過GET方法獲得指定URL下的文件。棕色的部分表示請求頭域的信息,綠色的部分表示通用頭部分。 

  Host頭域 

Host頭域指定請求資源的Intenet主機和端口號,必須表示請求url的原始服務器或網關的位置。HTTP/1.1請求必須包含主機頭域,否則系統會以400狀態碼返回。 

  Referer頭域 

Referer 頭域允許客戶端指定請求uri的源資源地址,這可以允許服務器生成回退鏈表,可用來登陸、優化cache等。他也允許廢除的或錯誤的連接由於維護的目的被 追蹤。如果請求的uri沒有自己的uri地址,Referer不能被發送。如果指定的是部分uri地址,則此地址應該是一個相對地址。 

  Range頭域 

Range頭域可以請求實體的一個或者多個子范圍。例如, 
表示頭500個字節:bytes=0-499 
表示第二個500字節:bytes=500-999 
表示最后500個字節:bytes=-500 
表示500字節以后的范圍:bytes=500- 
第一個和最后一個字節:bytes=0-0,-1 
同時指定幾個范圍:bytes=500-600,601-999 

但是服務器可以忽略此請求頭,如果無條件GET包含Range請求頭,響應會以狀態碼206(PartialContent)返回而不是以200 (OK)。 

  User-Agent頭域 

User-Agent頭域的內容包含發出請求的用戶信息。 

  響應消息 

響應消息的第一行為下面的格式: 

HTTP-VersionSPStatus-CodeSPReason-PhraseCRLF 

HTTP -Version表示支持的HTTP版本,例如為HTTP/1.1。Status- Code是一個三個數字的結果代碼。Reason-Phrase給Status-Code提供一個簡單的文本描述。Status-Code主要用於機器自 動識別,Reason-Phrase主要用於幫助用戶理解。Status-Code的第一個數字定義響應的類別,后兩個數字沒有分類的作用。第一個數字可 能取5個不同的值: 

1xx:信息響應類,表示接收到請求並且繼續處理 

2xx:處理成功響應類,表示動作被成功接收、理解和接受 

3xx:重定向響應類,為了完成指定的動作,必須接受進一步處理 

4xx:客戶端錯誤,客戶請求包含語法錯誤或者是不能正確執行 

5xx:服務端錯誤,服務器不能正確執行一個正確的請求 

響應頭域允許服務器傳遞不能放在狀態行的附加信息,這些域主要描述服務器的信息和 Request-URI進一步的信息。響應頭域包含Age、Location、Proxy-Authenticate、Public、Retry- After、Server、Vary、Warning、WWW-Authenticate。對響應頭域的擴展要求通訊雙方都支持,如果存在不支持的響應頭 域,一般將會作為實體頭域處理。 

典型的響應消息: 

HTTP/1.0200OK 
Date:Mon,31Dec200104:25:57GMT 
Server:Apache/1.3.14(Unix) 
Content-type:text/html 
Last-modified:Tue,17Apr200106:46:28GMT 
Etag:"a030f020ac7c01:1e9f" 
Content-length:39725426 
Content-range:bytes554554-40279979/40279980 

上例第一行表示HTTP服務端響應一個GET方法。棕色的部分表示響應頭域的信息,綠色的部分表示通用頭部分,紅色的部分表示實體頭域的信息。 

  Location響應頭 

Location響應頭用於重定向接收者到一個新URI地址。 

  Server響應頭 

Server響應頭包含處理請求的原始服務器的軟件信息。此域能包含多個產品標識和注釋,產品標識一般按照重要性排序。 

  實體 

請求消息和響應消息都可以包含實體信息,實體信息一般由實體頭域和實體組成。實體頭域包含關於實體的原信息,實體頭包括Allow、Content- Base、Content-Encoding、Content-Language、 Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、 Etag、Expires、Last-Modified、extension-header。extension-header允許客戶端定義新的實體 頭,但是這些域可能無法未接受方識別。實體可以是一個經過編碼的字節流,它的編碼方式由Content-Encoding或Content-Type定 義,它的長度由Content-Length或Content-Range定義。 

  Content-Type實體頭 

Content-Type實體頭用於向接收方指示實體的介質類型,指定HEAD方法送到接收方的實體介質類型,或GET方法發送的請求介質類型 Content-Range實體頭 

Content-Range實體頭用於指定整個實體中的一部分的插入位置,他也指示了整個實體的長度。在服務器向客戶返回一個部分響應,它必須描述響應覆蓋的范圍和整個實體長度。一般格式: 

Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth 

例如,傳送頭500個字節次字段的形式:Content-Range:bytes0- 499/1234如果一個http消息包含此節(例如,對范圍請求的響應或對一系列范圍的重疊請求),Content-Range表示傳送的范圍, Content-Length表示實際傳送的字節數。 

  Last-modified實體頭 

應答頭 說明
Allow 服務器支持哪些請求方法(如GET、POST等)。
Content-Encoding 文 檔的編碼(Encode)方法。只有在解碼之后才可以得到Content-Type頭指定的內容類型。利用gzip壓縮文檔能夠顯著地減少HTML文檔的 下載時間。Java的GZIPOutputStream可以很方便地進行gzip壓縮,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet應該通過查看Accept-Encoding頭(即request.getHeader("Accept- Encoding"))檢查瀏覽器是否支持gzip,為支持gzip的瀏覽器返回經gzip壓縮的HTML頁面,為其他瀏覽器返回普通頁面。
Content-Length 表 示內容長度。只有當瀏覽器使用持久HTTP連接時才需要這個數據。如果你想要利用持久連接的優勢,可以把輸出文檔寫入 ByteArrayOutputStram,完成后查看其大小,然后把該值放入Content-Length頭,最后通過 byteArrayStream.writeTo(response.getOutputStream()發送內容。
Content-Type 表示后面的文檔屬於什么MIME類型。Servlet默認為text/plain,但通常需要顯式地指定為text/html。由於經常要設置Content-Type,因此HttpServletResponse提供了一個專用的方法setContentTyep。 
Date 當前的GMT時間。你可以用setDateHeader來設置這個頭以避免轉換時間格式的麻煩。
Expires 應該在什么時候認為文檔已經過期,從而不再緩存它?
Last-Modified 文 檔的最后改動時間。客戶可以通過If-Modified-Since請求頭提供一個日期,該請求將被視為一個條件GET,只有改動時間遲於指定時間的文檔 才會返回,否則返回一個304(Not Modified)狀態。Last-Modified也可用setDateHeader方法來設置。
Location 表示客戶應當到哪里去提取文檔。Location通常不是直接設置的,而是通過HttpServletResponse的sendRedirect方法,該方法同時設置狀態代碼為302。
Refresh 表示瀏覽器應該在多少時間之后刷新文檔,以秒計。除了刷新當前文檔之外,你還可以通過setHeader("Refresh", "5; URL=http://host/path")讓瀏覽器讀取指定的頁面。 
注 意這種功能通常是通過設置HTML頁面HEAD區的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">實現,這是因為,自動刷新或重定向對於那些不能使用CGI或Servlet的 HTML編寫者十分重要。但是,對於Servlet來說,直接設置Refresh頭更加方便。 

注意Refresh的意義是“N秒之后 刷新本頁面或訪問指定頁面”,而不是“每隔N秒刷新本頁面或訪問指定頁面”。因此,連續刷新要求每次都發送一個Refresh頭,而發送204狀態代碼則 可以阻止瀏覽器繼續刷新,不管是使用Refresh頭還是<META HTTP-EQUIV="Refresh" ...>。 

注意Refresh頭不屬於HTTP 1.1正式規范的一部分,而是一個擴展,但Netscape和IE都支持它。
Server 服務器名字。Servlet一般不設置這個值,而是由Web服務器自己設置。
Set-Cookie 設置和頁面關聯的Cookie。Servlet不應使用response.setHeader("Set-Cookie", ...),而是應使用HttpServletResponse提供的專用方法addCookie。參見下文有關Cookie設置的討論。
WWW-Authenticate 客 戶應該在Authorization頭中提供什么類型的授權信息?在包含401(Unauthorized)狀態行的應答中這個頭是必需的。例如, response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。 
注意Servlet一般不進行這方面的處理,而是讓Web服務器的專門機制來控制受密碼保護頁面的訪問(例如.htaccess)。
 
在php中header函數
 
 1. 頁面沒找到 Not Found
  
  header(‘HTTP/1.1 404 Not Found’);
  
  2. 用這個header指令來解決URL重寫產生的404 header
  
  header(‘HTTP/1.1 200 OK’);
  
  3. 訪問受限
  
  header(‘HTTP/1.1 403 Forbidden’);
  
  // The page moved permanently should be used for
  
  // all redrictions, because search engines know
  
  // what's going on and can easily update their urls.
  
  4. 頁面被永久刪除,可以告訴搜索引擎更新它們的urls
  
  header(‘HTTP/1.1 301 Moved Permanently’);
  
  5. 服務器錯誤
  
  header(‘HTTP/1.1 500 Internal Server Error’);
  
  6. 重定向到一個新的位置
  
  header(‘Location: .example.org/’);
  
  7. 延遲一段時間后重定向
  
  header(‘Refresh: 10; url=.example.org/’);
  
  echo 'You will be redirected in 10 seconds';
  
  8. 加載要下載的文件:
  
  readfile(‘example.zip’);
  
  9. 也可以使用HTML語法來實現延遲
  
  header(‘Content-Transfer-Encoding: binary’);
  
  10. 禁止緩存當前文檔:
  
  header(‘Cache-Control: no-cache, no-store, max-age=0, must-revalidate’);
  
  header(‘Expires: Mon, 26 Jul 2010 05:00:00 GMT’);
  
  header(‘Pragma: no-cache’);
  
  11. 顯示登錄對話框,可以用來進行HTTP認證
  
  header(‘HTTP/1.1 401 Unauthorized’);
  
  header(‘WWW-Authenticate: Basic realm=“Top Secret”’);
  
  echo 'Text that will be displayed if the user hits cancel or ';
  
  echo 'enters wrong login data';
  
  12. 設置內容類型:
  
  header(‘Content-Type: text/html; charset=iso-8859-1’);
  
  header(‘Content-Type: text/html; charset=utf-8’);
  
  header(‘Content-Type: text/plain’); // plain text file
  
  header(‘Content-Type: image/jpeg’); // JPG picture
  
  header(‘Content-Type: application/zip’); // ZIP file
  
  header(‘Content-Type: application/pdf’); // PDF file
  
  header(‘Content-Type: audio/mpeg’); // Audio MPEG (MP3,…) file
  
  header(‘Content-Type: application/x-shockwave-flash’); // Flash animation

http://blog.chinaunix.net/uid-7374279-id-4518834.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM