前言
- 超文本傳輸協議:(HTTP,HyperText Transfer Protocol)是互聯網上應用最爲廣泛的一種網絡協議。所有的WWW文件都必須尊守這個標準。
- http最初目的是:爲了提供一種發佈和接收HTML頁面的方法
- *HTTP報文是面向文本的,報文中的每一個字段都是一些ASCII碼串,個字段的長度是不確定的。http有兩類報文:請求報文和響應報文
HTTP請求報文
一個HTTP請求報文由請求行(request line)、請求頭(header)、空行和請求數據四部分
<request-line>
<headers>
<blank line>
<request-body>
請求頭
- 請求行由請求方法字段、URL字段和HTTp協議版本字段3個字段組成,他們用空格分隔
- HTTP協議請求方法有GET、POST、HEAD、PUT 、DELETE、 OPTIONS、 TRACE、 CONNECT
- get:當客戶端要從服務器中讀取文檔時,當點擊網頁上的鏈接或者通過在瀏覽器的地址欄輸入網址來瀏覽網頁的,使用的都是GET方式。GET方法要求服務器將URL定位的資源放在響應報文的數據部分,回送給客戶端。使用GET方法時,請求參數和對應的值附加在URL後面,利用一個問號(“?”)代表URL的結尾與請求參數的開始,傳遞參數長度受限制。例如,/index.jsp?id=100&op=bind,這樣通過GET方式傳遞的數據直接表示在地址中,所以我們可以把請求結果以鏈接的形式發送給好友。以用google搜索domety爲例,Request格式如下:
GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,
application/msword, application/x-silverlight, application/x-shockwave-flash, */*
Referer: <a href="http://www.google.cn/">http://www.google.cn/</a>
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)
Host: <a href="http://www.google.cn">www.google.cn</a>
Connection: Keep-Alive
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;
NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
FxlRugatx63JLv7CWMD6UB_O_r
可以看到,GET方式的請求一般不包含”請求內容”部分,請求數據以地址的形式表現在請求行。地址鏈接如下:
<a href="http://www.google.cn/search?hl=zh-CN&source=hp&q=domety&aq=f&oq=">http://www.google.cn/search?hl=zh-CN&source=hp
&q=domety&aq=f&oq=</a>
地址中”?”之後的部分就是通過GET發送的請求數據,我們可以在地址欄中清楚的看到,各個數據之間用”&”符號隔開。顯然,這種方式不適合傳送私密數據。另外,由於不同的瀏覽器對地址的字符限制也有所不同,一般最多隻能識別1024個字符,所以如果需要傳送大量數據的時候,也不適合使用GET方式。
2. post;對於上面提到的不適合使用GET方式的情況,可以考慮使用POST方式,因爲使用POST方法可以允許客戶端給服務器提供信息較多。POST方法將請求參數封裝在HTTP請求數據中,以名稱/值的形式出現,可以傳輸大量數據,這樣POST方式對傳送的數據大小沒有限制,而且也不會顯示在URL中。還以上面的搜索domety爲例,如果使用POST方式的話,格式如下:
POST /search HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,
application/msword, application/x-silverlight, application/x-shockwave-flash, */*
Referer: <a href="http://www.google.cn/">http://www.google.cn/</a>
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)
Host: <a href="http://www.google.cn">www.google.cn</a>
Connection: Keep-Alive
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;
NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
FxlRugatx63JLv7CWMD6UB_O_r
hl=zh-CN&source=hp&q=domety
可以看到,POST方式請求行中不包含數據字符串,這些數據保存在”請求內容”部分,各數據之間也是使用”&”符號隔開。POST方式大多用於頁面的表單中。因爲POST也能完成GET的功能,因此多數人在設計表單的時候一律都使用POST方式,其實這是一個誤區。GET方式也有自己的特點和優勢,我們應該根據不同的情況來選擇是使用GET還是使用POST。
3. HEAD :HEAD就像GET,只不過服務端接受到HEAD請求後只返回響應頭,而不會發送響應內容。當我們只需要查看某個頁面的狀態的時候,使用HEAD是非常高效的,因爲在傳輸的過程中省去了頁面內容。
請求頭
- 請求頭部由關鍵字/值對組成,每行一對,關鍵字和值用英文冒號“:”分隔。請求頭部通知服務器有關於客戶端請求的信息,典型的請求頭有:
- User-Agent:產生請求的瀏覽器類型。
- Accept:客戶端可識別的內容類型列表。
- Host:請求的主機名,允許多個域名同處一個IP地址,即虛擬主機。
請求頭 | 說明 |
---|---|
Host | 接受請求的服務器地址,可以是IP:端口號,也可以是域名 |
User-Agent | 發送請求的應用程序名稱 |
Connection | 指定與連接相關的屬性,如Connection:Keep-Alive |
Accept-Charset | 通知服務端可以發送的編碼格式 |
Accept-Encoding | 通知服務端可以發送的數據壓縮格式 |
Accept-Language | 通知服務端可以發送的語言 |
空行
最後一個請求頭之後是一個空行,發送回車符和換行符,通知服務器以下不再有請求頭
請求數據
請求數據不在GET方法中使用,而是在POST方法中使用。POST方法適用於需要客戶填寫表單的場合。與請求數據相關的最常使用的請求頭是Content-Type和Content-Length。
HTTP響應報文
HTTP響應也由三個部分組成,分別是:狀態行、消息報頭、響應正文。
狀態行格式
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服務器HTTP協議的版本;Status-Code表示服務器發回的響應狀態代碼;Reason-Phrase表示狀態代碼的文本描述。狀態代碼由三位數字組成,第一個數字定義了響應的類別,且有五種可能取值。
- 1xx:指示信息–表示請求已接收,繼續處理。
- 2xx:成功–表示請求已被成功接收、理解、接受。
- 3xx:重定向–要完成請求必須進行更進一步的操作。
- 4xx:客戶端錯誤–請求有語法錯誤或請求無法實現。
- 5xx:服務器端錯誤–服務器未能實現合法的請求。
- 常見狀態代碼、狀態描述的說明如下。
- 200 OK:客戶端請求成功。
- 400 Bad Request:客戶端請求有語法錯誤,不能被服務器所理解。
- 401 Unauthorized:請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用。
- 403 Forbidden:服務器收到請求,但是拒絕提供服務。
- 404 Not Found:請求資源不存在,舉個例子:輸入了錯誤的URL。
- 500 Internal Server Error:服務器發生不可預期的錯誤。
- 503 Server Unavailable:服務器當前不能處理客戶端的請求,一段時間後可能恢復正常,舉個例子:HTTP/1.1 200 OK(CRLF)
響應頭部
與請求頭部類似,爲響應報文添加了一些附加信息
常見響應頭部如下:
響應頭 | 說明 |
---|---|
Server | 服務器應用程序軟件的名稱和版本 |
Content-Type | 響應正文的類型(是圖片還是二進制字符串) |
Content-Length | 響應正文長度 |
Content-Charset | 響應正文使用的編碼 |
Content-Encoding | 響應正文使用的數據壓縮格式 |
Content-Language | 響應正文使用的語言 |
下面給出一個HTTP響應報文例子
HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122
<html>
<head>
<title>Wrox Homepage</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>
URI、URL和URN 之間的區別
- URI全名爲Uniform Resource Indentifier(統一資源標識),用來唯一的標識一個資源,是一個通用的概念,URI由兩個主要的子集URL和URN組成
- URL全名爲Uniform Resource Locator(統一資源定位),通過描述資源的位置來標識資源
- URN全名爲Uniform Resource Name(統一資源命名),通過資源的名字來標識資源,與其所處的位置無關,這樣即使資源的位置發生變動,其URN也不會變化
- HTTP規範將更通用的概念URI作爲其資源標識符,但是實際上,HTTP應用程序處理的只是URI的URL子集