Http初探
2010-08-23 14:01 空逸云 閱讀(312) 評論(4) 收藏 舉報學Asp.net的時間也不短了..進而卻發現知道的東西太少.而MVC又冒出來.感覺以前的學習方式不太正確,應該先學習其本質,弄懂了本質.那么其他的都是虛的.加之在寫項目過程中,對于一些Http的操作又不是很熟悉,所以就先了解了一下Http協議.下面.是一些個人小小的心得.
關于Http的介紹就不詳寫了.相關資料可以查看維基等.為什么要使用Http協議?Http協議具有什么特點?
- 支持客戶端/服務器模式
- 簡單快捷;客戶端向服務器請求服務時,只需要發送請求方法和路徑.請求方法常用的有GET,POST,HEAD.每種方法規定了客戶端與服務器端聯系的類型不同.
- 靈活;Http允許傳輸任意類型的數據對象.以Content-Type標記.
- 無連接;無連接的意思就是每次連接只處理一個請求,服務器處理請求結束.并收到客戶端的回應后,即斷開連接.
- 無狀態;眾所周知,Http是一種無狀態協議,所謂無狀態.即不保存(記憶)當前事務的狀態/信息,這樣意味著每次我們發送的請求,都會得到一樣的處理.因為前面處理的結果已丟失.Asp.net用ViewState在模擬有狀態傳輸.無狀態由于不需要保存其他數據/信息,所以應答相對更快.
Http的組成
Http主要又Http請求和Http響應組成,請求即指客戶端向服務器端發送請求,要求獲取服務器的資源/處理,響應即指服務器收到了客戶端的請求,對請求作出處理,并發送處理結果的一個過程.下面.通過HttpWatch的分析進一步/清晰解析

可以看出,左邊為HttpRequest,右邊為HttpResponse.
Http請求(HttpRequest)
Http請求由請求行,消息報頭(或稱消息頭域),請求正文三部分組成.
看到上圖Request中的第一行,有個Request-Line.這就是請求行,請求行的組成:以一個方法符號開頭,空格分開,后面跟著請求的URI和協議的版本.此處的方法為GET,請求URI為http://www.rzrgm.cn/kongyiyun 版本為Http的1.1,規范模式如下:Method Request-URI Http-Version CRLF,前面三個已經很好的理解了.那么后面的CRLF是什么.在這里CRLF是Http協議中的回車換行,我們以可以把它當成是一行的結束,例如,http中的空白行表示 CRLF,就一個或多個的空白符+CRLF.PS:除了作為結尾的CRLF外,不允許出現單獨的CR和LF字符
Methods
請求方法有多種(PS:請求方法大小寫有區別,規定要全部大寫),各個方法的解釋如下:
GET: 請求獲取Request-URI所標識的資源
POST: 在Request-URI所標識的資源后附加新的數據
HEAD:請求獲取由Request-URI所標識的資源的響應消息報頭
PUT: 請求服務器存儲一個資源,并用Request-URI作為其標識
DELETE: 請求服務器刪除Request-URI所標識的資源
TRACE: 請求服務器會送收到的請求信息,主要用于測試和診斷
CONNECT: 保留將來使用
OPTIONS: 請求查詢服務器的性能,或者查詢與資源相關的選項和需求
其中,我們平時用得最多的就GET,POST,HEAD三種:
GET:當你在瀏覽器地址欄中輸入一個URL,并回車時,便發送了一個GET請求,或點擊一個超鏈接時,也發送了一個GET請求,主要請求資源.
POST:當你填寫一份表單,按下提交按鈕時,便發送了一個POST請求,POST請求除了有GET的請求外,它還附加了一些額外的信息.
HEAD:HEAD發送和GET一樣的請求.不同的是.服務器的響應是沒用正文的,也就是只會獲得相應頭,利用這個方法,不必傳輸整個資源的所有內容,就可以得到Request-URI所標識的資源的信息,該方法常用于測試超鏈接的有效性,是否可以訪問,以及最近是否更新等.
URI
將在后面介紹
Http-Version
現在主流使用的Http版本為1.1,相對1.0而言,1.1更嚴謹.更....具體可參考維基/Http文檔
URL
Http url(URL是一種特殊類型的URI,包含了用于查找某個資源的足夠的信息)的格式如下:
http標識要通過HTTP協議來定位網絡資源;host標識合法的Internet主機域名或IP地址;port指定一個端口號,若缺省則使用默認80端口,事實上.我們打上http://www.rzrgm.cn/kongyiyun這樣的地址時,瀏覽器會自動幫我們轉換成http://www.rzrgm.cn:80/kongyiyun這樣的地址;abs_path指定請求資源的URI;如果URL中沒有給出abs_path,那么當它作為請求的URI時,必須以"/"的形式給出,通常這個工作瀏覽器自動幫我們完成.
如:
瀏覽器會自動轉換成http://www.rzrgm.cn/ 而/又會自動去尋找根目錄下的默認文件,如Default.aspx
Http響應(HttpResponse)
當服務器接收到一個請求后,處理過請求后,服務器發送一個響應回客戶端.
Http響應也是由三部分組成,分別是:狀態行,響應消息報頭(或稱響應頭域 Response Header Fields),響應正文
狀態行
狀態行的基本格式:HTTP-Version Status-Code Reson-Phrase CRLF;從上圖右邊的第一樣可以看到.(Status-Line) HTTP/1.1 200 OK其中HTTP-Version如同Request.為HTTP協議的版本.此為1.1,Status-Code標識服務器發回的響應狀態碼.請求的響應結果都可以通過Status-Code來識別.;而Reason-Phrase這表示狀態碼的文本描述;
狀態碼(Status-Code)
狀態碼由3位數字組成,第一個數字定義了響應的類別,共有5種可能取值
1xx: 指示信息-->標識請求已接受,繼續處理
2xx: 成功-->表示請求已被成功接收,理解,處理
3xx: 重定向-->要完成請求必須更進一步的操作
4xx: 客戶端錯誤-->請求有語法錯誤或請求無法實現
5xx: 服務器端錯誤-->服務器未能實現合法的請求
常見的狀態碼有:
200 OK //客戶端請求成功
400 BadRequest//客戶端請求語法有錯誤,不能被服務器所理解
401 Unauthorized //請求未授權
403 Forbidden //服務器收到請求,但是拒絕提供服務
404 Not Found //最常見的錯誤,無法找到資源
500 InternalServerError//服務器發生不可預期的錯誤
503 Server Unavailable //服務器當前不能處理客戶端請求.
其他如下:
100 繼續
101 轉換協議
200 OK
201 已創建
202 接受
203 非權威信息
204 無內容
205 重置內容
206 部分內容
300 多個選擇
301 永久移動
302 發現
303 見其它
304 沒有被改變
305 使用代理
307 臨時重發
400 壞請求
401 未授權的
402 必要的支付
403 禁用
404 沒有找到
405 方式不被允許
406 不接受的
407 需要代理驗證
408 請求超時
409 沖突
410 不存在
411 長度必需
412 先決條件失敗
413 請求實體太大
414 請求URI太大
415 不被支持的媒體類型
416 請求的范圍不滿足
417 期望失敗
500 服務器內部錯誤
501 不能實現
502 壞網關
503 服務不能獲得
504 網關超時
505 HTTP版本不支持
響應報頭后續,響應正文就是服務器回發的資源內容
消息報頭(消息頭域)
Http消息由客戶端到服務器的請求和服務器到客戶端的響應組成.請求消息和響應消息都是有開始行(HttpRequest:請求行,HttpResponse:狀態行),消息報頭(可選),空行(只有CRLF的行),消息正文(可選)組成.
消息報頭包括普通報頭,請求報頭,響應報頭.
每個報頭域都由名字+":"+空格+值組成,報頭域的名字忽略大小寫
普通報頭
在普通報頭中,有少數報頭域用于所有的請求和響應消息,但并不用于被傳輸的實體,只用于傳輸的消息.
如:
Cathe-Control:用于指定緩存指令.
Data:表示消息產生的日期和時間
Connection:普通報頭域允許發送指定連接的選項.例如指定連接是連續,或者是"close"關閉
請求報頭
終于到它了.請求報頭中包含著客戶端發送給服務器端的各種信息,包括客戶端的信息.
常見的請求報頭信息:
Accept: Accept請求報頭域用于指定客戶端接收哪種類型的信息;如:text/html.表明接受html
可以參考上圖+一下說明

響應報頭
響應報頭允許服務器傳遞不能放在狀態行中的附加響應信息,以及關于服務器的信息和對Request-URI所標識
的資源進行下一步訪問的信息。
常用的響應報頭
Location
Location響應報頭域用于重定向接受者到一個新的位置。Location響應報頭域常用在更換域名的時候。
Server
Server響應報頭域包含了服務器用來處理請求的軟件信息。與User-Agent請求報頭域是相對應的。下面是
Server響應報頭域的一個例子:
Server:Apache-Coyote/1.1
WWW-Authenticate
WWW-Authenticate響應報頭域必須被包含在401(未授權的)響應消息中,客戶端收到401響應消息時候,并發
送Authorization報頭域請求服務器對其進行驗證時,服務端響應報頭就包含該報頭域。
eg:WWW-Authenticate:Basic realm="Basic Auth Test!" //可以看出服務器對請求資源采用的是基本驗證機制。
實體報頭
請求和響應消息都可以傳送一個實體。一個實體由實體報頭域和實體正文組成,但并不是說實體報頭域和實體正文要在一起發送,可以只發送實體報頭域。實體報頭定義了關于實體正文(eg:有無實體正文)和請求所標識的資源的元信息。
常用的實體報頭
Content-Encoding
Content-Encoding實體報頭域被用作媒體類型的修飾符,它的值指示了已經被應用到實體正文的附加內容的編
碼,因而要獲得Content-Type報頭域中所引用的媒體類型,必須采用相應的解碼機制。Content-Encoding這樣用
于記錄文檔的壓縮方法,eg:Content-Encoding:gzip
Content-Language
Content-Language實體報頭域描述了資源所用的自然語言。沒有設置該域則認為實體內容將提供給所有的語言
閱讀
者。eg:Content-Language:da
Content-Length
Content-Length實體報頭域用于指明實體正文的長度,以字節方式存儲的十進制數字來表示。
Content-Type
Content-Type實體報頭域用語指明發送給接收者的實體正文的媒體類型。eg:
Content-Type:text/html;charset=ISO-8859-1
Content-Type:text/html;charset=GB2312
Last-Modified
Last-Modified實體報頭域用于指示資源的最后修改日期和時間。
Expires
Expires實體報頭域給出響應過期的日期和時間。為了讓代理服務器或瀏覽器在一段時間以后更新緩存中(再次
訪問曾訪問過的頁面時,直接從緩存中加載,縮短響應時間和降低服務器負載)的頁面,我們可以使用Expires
實體報頭域指定頁面過期的時間。eg:Expires:Thu,15 Sep 2006 16:23:12 GMT
出處:http://kongyiyun.cnblogs.com
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
浙公網安備 33010602011771號