1. 程式人生 > >HTTP協議-HTTP特點、請求和響應

HTTP協議-HTTP特點、請求和響應

更多詳細內容請看W3C/HTTP1.1官方文件,英文原文地址

HTTP協議

主要特點

  • 支援客戶/伺服器模型(C/S)

  • 靈活

  • 無連線:無連線的含義是限制每次連線只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線,採用這種方式可以節省傳輸時間。(當今多數伺服器支援Keep-Alive功能,使用伺服器支援長連線,解決無連線的問題)

  • 無狀態:無狀態是指協議對於事務處理沒有記憶能力,伺服器不知道客戶端是什麼狀態。即客戶端傳送HTTP請求後,伺服器根據請求,會給我們傳送資料,傳送完後,不會記錄資訊。(使用cookie機制可以保持session,解決無狀態的問題)

HTTP請求

一個從客戶端到伺服器的請求訊息包括一行請求訊息,方法,資源標識,協議版本。

Request

= Request-Line  Section 5.1

*(( general-header

| request-header

| entity-header ) CRLF)

CRLF

[ message-body ]

請求行(Request-Line)

請求行以方法(Method)開頭,後面跟著請求統計資源定位地址(Request-URI).方法是大小寫敏感的。

方法

     Method     = "OPTIONS"

                             | "
GET" | "HEAD" | "POST" | "PUT" | "DELETE" |"TRACE" |"CONNECT"|extension-method

這個列表中的方法在Allow頭部域中被指定允許。伺服器響應的返回碼總是會通知客戶端請求資源是否在當前方法是否被允許,因為被允許的方法集是會動態改變的。如果伺服器理解但對請求資源方法不被允許,伺服器會返回405,如果伺服器無法識別方法,會返回501(沒有實現).GET

HEAD方法必須被所有普通的伺服器支援,其他方法是可選的。如果要實現上述方法,就必須使用相同的語義實現。

請求URI

請求URI是統一的資源識別符號,在請求上標識資源。


        Request-URI    =  "*"     |    absoluteURI    |    abs_path    |    authority   

Request-URI的四個選項依賴於請求的性質。星號”*”意思是除了伺服器自己之外,請求不支援特定的資源,並且只有當方法沒有應用於特定的資源下才可被使用。一個簡單的例子如下:


        OPTIONS    *        HTTP/1.1

這絕對地址(absoluteURI)是必要的當向代理提交請求時,代理可能會要求再次轉發或從一個有效的快取裡構造響應請求。

請求資源的識別(The Resource Identified by a Request)

請求資源的精確定位是由請求裡的Request-URI和Host頭域決定的。

如果源伺服器不允許資源根據請求的不同主機來區分時,那麼它會忽略Host頭域的值,當它決定通過HTTP/1.1請求來識別資源時。

請求頭域 Request Header Fields

請求頭域允許客戶端傳遞關於請求和客戶端的附加的資訊給伺服器。這些頭域作為請求的修飾,這和程式語言方法呼叫的引數語義是等價的。


    request-header    =     Accept

                                    |    Accept-Charset

                                    |    Accept-Encoding

                                    |    Accept-Language

                                    |    Authorization

                                    |    Expect

                                    |    From

                                    |    Host

                                    |    IF-Match

                                    |    IF-Modified-Since

                                    |    IF-Range

                                    |    IF-Unmodified-Since

                                    |    IF-None-Match        

                                    |    Max-Forwards

                                    |    Proxy-Authorization

                                    |    Range

                                    |    Referer

                                    |    TE

                                    |    User-Agent

請求資料

使用GET方法訪問某網站,則HTTP請求報文為:


    GET /index.html    HTTP/1.1    \r\n

    Host: www.gduf.edu.cn        \r\n

    User-Agent:Mozilla/5.0    \r\n

    Accept-Language:cn */*    \r\n

HTTP響應

接收到請求訊息並解析後,伺服器就會發送一個HTTP響應訊息。

狀態行

響應(Response)訊息的第一行是是狀態行,其內容包括協議版本、數值型狀態碼、原因文字描述。格式如下:

結果碼和原因描述

結果碼(Status-Code)是一個3位的整數,一般在程式中使用。原因描述(Resion-Phrase)是結果碼的文字解釋,是給人類使用者看的。結果碼的第一位數字是HTTP響應的分類碼,後面兩位數字表述大分類下的具體結果。第一位數字有1到5共5個值,分類如下:

- 1xx: 資訊-請求已接收,繼續處理

- 2xx: 成功- 資訊已經收到,理解並接受

- 3xx:  重定向-為了完成請求必須採取進一步動作

- 4xx: 客戶端錯誤-請求包含錯誤語法或無法被滿足

-5xx: 伺服器錯誤-伺服器無法完成一個顯然有效的請求

常見的狀態碼

200    OK    :客戶端請求成功

300    Multiple Choices: 針對請求,伺服器可執行多種操作。

301    Moved Permanently:永久移動,請求網頁已永久移動到新位置

302    Found

303    See Other:檢視其他位置,請求者應當對不同的位置使用單獨的GET請求來檢索響應時,伺服器返回此程式碼 

307    Temporary Redirect:臨時重定向,伺服器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置進行以後的請求

400    Bad Request:    客戶端請求有語法錯誤,不能被伺服器所理解

401    Unauthorized:    請求未經授權

403    Forbidden:    伺服器收到請求,但是拒絕提供服務

404    Not Found:    請求資源不存在

500    Internal Server Error:    伺服器發生不可預期錯誤

503    Server Unavaliable:    伺服器當前不能處理客戶端請求,一段時間後可能恢復正常