資料均來自互聯網,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。
人魔七七:http://www.cnblogs.com/qiqibo/
一個http請求只要由三部分組成:請求行,請求頭,請求主體。請求行和請求頭是行文本用回車或者換行符分隔。在http用文本值使他們更容易構造,解析,和調試。一個空行,只是一個回車/換行符組成的序列或只是一個換行符,將請求頭從請求主體分離。
下面代碼片段包含一個http請求例子關於搜索的請求。
GET /search?source=ig&hl=en&rlz=&q=ios&btnG=Google+Search HTTP/1.1
Host: www.google.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0)…
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en,en-us;q=0.7,en-ca;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://www.google.com/ig?hl=en&source=webhp
Cookie: PREF=ID=fdf9979…
這個請求行是第一行的發送數據到服務器。這個請求行包含三個關鍵字信息:http請求方法,請求URL,和http版本。
請求方法只是一個詞表明客戶端請求的行為。因為是區分大小寫,所以下面標准的請求都是大寫值。上面的例子請求是大寫的GET。
GET:從服務器檢索內容或者實體在HTTP術語。GET請求通常不包含請求體,但是是被允許的。一些網絡緩存設備僅僅GET方式響應。GET請求通常不會導致服務器數據變化。
POST:用客戶端提供的數據更新實體。一個POST請求通常在請求體中包含信息,這些信息在應用服務器是可以被使用的。POST請求被認為是非冪等性的,意味着如果多個請求被處理和僅僅一個請求被處理結果是不一樣的。
HEAD:檢索一個響應的數據不用檢索整個響應的內容。這個方法通常被用來檢索服務器最近有沒有數據更新而不是檢索整個內容。
PUT:添加一個由客戶端提供的數據實體。一個PUT請求通常在請求體包含服務器用來創建新實體用的信息。通常,PUT請求被認為是冪等性的,意味着請求可以反復使用相同應用的結果。
DELETE:刪除一個基於URI內容的實體或者由客戶端提供的請求體。DELETE請求通常在REST服務請求接口。
第二個關鍵字在請求行是URI,URI唯一標識請求的目標。如果請求用的是GET方式,這個URI不含糊的指定內容來檢索目標服務器。這個URI可能包含查詢參數,但是不能包含空格或者換行符。前面的代碼片段URI包含幾個查詢參數,每個用&分隔,注意URI不能包含協議,主機或者端口這是用戶經常提供的瀏覽器地址。這個客戶端用這個協議URL一部分來決定怎么連接服務器。這個主機名字和端口通過客戶端在請求主機頭來提供。
這個請求行的最后一個關鍵字指定http協議的版本。在之前http請求代碼例子指定版本是1.1。意味着服務器應該希望客戶端提供頭和規則為http協議版本指定。
緊跟着這個請求行的是請求頭,給服務器提供額外的元數據。這個元數據可能描述客戶端,將來描述請求或者從服務器請求某種類型的響應。在每個請求中提供一個或者多個請求頭。主機頭僅僅在http1.1版本需要。它提供被客戶端提供原始主機名字並且可能包含被原始請求URL提供的端口值。一個http服務器可能為多個主機名字提供內容。主機頭 幫助HTTP服務器知道原始請求的主機。
盡管他用有狀態的TCP傳輸層,HTTP被定義為無狀態的協議。這意味着HTTP服務器不保留任何信息關於在將來的一個請求。Cookies被作為一個方法來允許一些狀態信息存儲到客戶端並且在將來的請求和服務器通信。
HTTP請求頭下面是一個可選的請求體。這個請求體是任意序列字節被一個空行從請求頭分隔。這個請求體必須遵守之前服務器和客戶端協定好的數據編碼。對web服務器這是用於web瀏覽器通常表單編碼的數據
但是對於手機應用通常是XML和JSON數據編碼。
注意:HTTP允許客戶端和服務器端中介添加刪除修改HTTP請求頭。因此從應用向服務器發出的請求可以攜帶新的請求頭修改或者刪除請求頭。