http請求和http響應詳細解析

來源:互聯網
上載者:User

標籤:

HTTP請求格式

當瀏覽器向Web伺服器發出請求時,它向伺服器傳遞了一個資料區塊,也就是請求資訊,HTTP請求資訊由3部分組成:

l   要求方法URI協議/版本

l   要求標頭(Request Header)

l   請求本文

下面是一個HTTP請求的例子:

GET/sample.jspHTTP/1.1

 

Accept:image/gif.image/jpeg,*/*

Accept-Language:zh-cn

Connection:Keep-Alive

Host:localhost

User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)

Accept-Encoding:gzip,deflate

 

username=jinqiao&password=1234

(1)要求方法URI協議/版本

請求的第一行是“方法URL議/版本”:GET/sample.jsp HTTP/1.1

以上代碼中“GET”代表要求方法,“/sample.jsp”表示URI,“HTTP/1.1代表協議和協議的版本。

根據HTTP標準,HTTP請求可以使用多種要求方法。例如:HTTP1.1目前支援7種要求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。

GET      請求擷取由Request-URI所標識的資源。
POST 在Request-URI所標識的資源後附加新的資料。
HEAD 請求擷取由Request-URI所標識的資源的響應訊息前序。

OPTIONS 請求查詢服務器的效能,或查詢與資源相關的選項和需求。
PUT 請求伺服器儲存一個資源,並用Request-URI作為其標識。
DELETE 請求伺服器刪除由Request-URI所標識的資源。
TRACE 請求伺服器回送收到的請求資訊,主要用語測試或診斷。
在Internet應用中,最常用的方法是GET和POST。

URI完整地指定了要訪問的網路資源,通常只要給出相對於伺服器的根目錄的相對目錄即可,因此總是以“/”開頭,最後,協議版本聲明了通訊過程中使用HTTP的版本。

 

(2)要求標頭(Request Header)

要求標頭包含許多有關的用戶端環境和請求本文的有用資訊。例如,要求標頭可以聲明瀏覽器所用的語言,請求本文的長度等。

Accept:image/gif.image/jpeg.*/*

Accept-Language:zh-cn

Connection:Keep-Alive

Host:localhost

User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)

Accept-Encoding:gzip,deflate.

 

(3)請求本文

要求標頭和請求本文之間是一個空行,這個行非常重要,它表示要求標頭已經結束,接下來的是請求本文。請求本文中可以包含客戶提交的查詢字串資訊:

username=jinqiao&password=1234

在以上的例子的HTTP請求中,請求的本文只有一行內容。當然,在實際應用中,HTTP請求本文可以包含更多的內容。

HTTP要求方法我這裡只討論GET方法與POST方法

l   GET方法

GET方法是預設的HTTP要求方法,我們日常用GET方法來提交表單資料,然而用GET方法提交的表單資料只經過了簡單的編碼,同時它將作為URL的一部分向Web伺服器發送,因此,如果使用GET方法來提交表單資料就存在著安全隱患上。例如

Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB

從上面的URL請求中,很容易就可以辯認出表單提交的內容。(?之後的內容)另外由於GET方法提交的資料是作為URL請求的一部分所以提交的資料量不能太大

 

l  POST方法

POST方法是GET方法的一個替代方法,它主要是向Web伺服器提交表單資料,尤其是大批量的資料。POST方法克服了GET方法的一些缺點。通過POST方法提交表單資料時,資料不是作為URL請求的一部分而是作為標準資料傳送給Web伺服器,這就克服了GET方法中的資訊無法保密和資料量太小的缺點。因此,出於安全的考慮以及對使用者隱私的尊重,通常表單提交時採用POST方法。

  從編程的角度來講,如果使用者通過GET方法提交資料,則資料存放在QUERY_STRING環境變數中,而POST方法提交的資料則可以從標準輸入資料流中擷取。

 

http響應格式

HTTP應答與HTTP請求相似,HTTP響應也由3個部分構成,分別是:

l  狀態行

l  回應標頭(Response Header)

l  響應本文

在接收和解釋請求訊息後,伺服器會返回一個HTTP響應訊息。

狀態行由協議版本、數字形式的狀態碼、及相應的狀態原因,各元素之間以空格分隔。

格式:    HTTP-Version Status-Code Reason-Phrase CRLF

例如:    HTTP/1.1 200 OK \r\n

 

狀態碼:

狀態碼由3位元字組成,表示請求是否被理解或被滿足。

狀態原因:

狀態原因給出了關於狀態碼的簡短的文字描述。

狀態碼的第一個數字定義了響應的類別,後面兩位沒有具體的分類。

第一個數字有五種可能的取值:

- 1xx:   指示資訊—表示請求已接收,繼續處理。

- 2xx:   成功—表示請求已經被成功接收、理解、接受。

- 3xx:   重新導向—要完成請求必須進行更進一步的操作。

- 4xx:   用戶端錯誤—請求有語法錯誤或請求無法實現。

- 5xx: 伺服器端錯誤—伺服器未能實現合法的請求。

狀態碼 狀態原因    說明

   200      OK    用戶端請求成功

   400         Bad Request   由於用戶端請求有語法錯誤,不能被伺服器所理解。

   401         Unauthonzed   請求未經授權。這個狀態碼必須和WWW-Authenticate前序域一起使用

   403   Forbidden   伺服器收到請求,但是拒絕提供服務。伺服器通常會在響應本文中給出不提供服務的原因

   404   Not Found   請求的資源不存在,例如,輸入了錯誤的URL。

   500     Internal Server Error 伺服器發生不可預期的錯誤,導致無法完成用戶端的請求。

   503      Service Unavailable   伺服器當前不能夠處理用戶端的請求,在一段時間之後,伺服器可能會恢複正常。

 

回應標頭

回應標頭可能包括:

Location: 

Location響應前序域用於重新導向接受者到一個新的位置。例如:用戶端所請求的頁面已不存在原先的位置,為了讓用戶端重新導向到這個頁面新的位置,服務 器端可以發回Location響應前序後使用重新導向語句,讓用戶端去訪問新的網域名稱所對應的伺服器上的資源。當我們在JSP中使用重新導向語句的時候,伺服器 端向用戶端發回的響應前序中,就會有Location響應前序域。

Server:  

Server響應前序域包含了伺服器用來處理請求的軟體資訊。它和User-Agent請求前序域是相對應的,前者發送伺服器端軟體的資訊,後者發送客戶 端軟體(瀏覽器)和作業系統的資訊。下面是Server響應前序域的一個例子:Server: Apache-Coyote/1.1

WWW-Authenticate:

WWW-Authenticate響應前序域必須被包含在401(未授權的)響應訊息中,這個前序域和前面講到的Authorization請求前序域是 相關的,當用戶端收到401響應訊息,就要決定是否請求伺服器對其進行驗證。如果要求伺服器對其進行驗證,就可以發送一個包含了 Authorization前序域的請求,下面是WWW-Authenticate響應前序域的一個例子:WWW-Authenticate: Basic realm="Basic Auth Test!"

從這個響應前序域,可以知道伺服器端對我們所請求的資源採用的是基本驗證機制。

 Content-Encoding:

Content-Encoding實體前序域被使用作媒體類型的修飾符,它的值指示了已經被應用到實體本文的附加內容編碼,因而要獲得Content- Type前序域中所引用的媒體類型,必須採用相應的解碼機制。Content-Encoding主要用語記錄文檔的壓縮方法,下面是它的一個例子: Content-Encoding: gzip。如果一個實體本文採用了編碼方式儲存,在使用之前就必須進行解碼。

Content-Language:

Content-Language實體前序域描述了資源所用的自然語言。Content-Language允許使用者遵照自身的慣用語言來識別和區分實體。 如果這個實體內容僅僅打算提供給丹麥的閱讀者,那麼可以按照如下的方式設定這個實體前序域:Content-Language: da。

如果沒有指定Content-Language前序域,那麼實體內容將提供給所以語言的閱讀者。

 Content-Length:

  Content-Length實體前序域用於指明本文的長度,以位元組方式儲存的十進位數字來表示,也就是一個數字字元佔一個位元組,用其對應的ASCII碼儲存傳輸。

       要注意的是:這個長度僅僅是表示實體本文的長度,沒有包括實體前序的長度。

Content-Type

     Content-Type實體前序域用語指明發送給接收者的實體本文的媒體類型。例如:

Content-Type: text/html;charset=ISO-8859-1

   Content-Type: text/html;charset=GB2312

Last-Modified

     Last-Modified實體前序域用於指示資源最後的修改日期及時間。

Expires

     Expires實體前序域給出響應到期的日期和時間。通常,Proxy 伺服器或瀏覽器會緩衝一些頁面。當使用者再次訪問這些頁面時,直接從緩衝中載入並顯示給用 戶,這樣縮短了響應的時間,減少伺服器的負載。為了讓Proxy 伺服器或瀏覽器在一段時間後更新頁面,我們可以使用Expires實體前序域指定頁面到期的時 間。當使用者又一次訪問頁面時,如果Expires前序域給出的日期和時間比Date普通前序域給出的日期和時間要早(或相同),那麼Proxy 伺服器或瀏覽器就 不會再使用緩衝的頁面而是從伺服器上請求更新的頁面。不過要注意,即使頁面到期了,也並不意味著伺服器上的原始資源在此時間之前或之後發生了改變。

      Expires實體前序域使用的日期和時間必須是RFC 1123中的日期格式,例如:

 Expires: Thu, 15 Sep 2005 16:00:00 GMT

       HTTP1.1的用戶端和緩衝必須將其他非法的日期格式(也包括0)看作已到期。例如,為了讓瀏覽器不要快取頁面面,我們也可以利用Expires實體前序 域,設定它的值為0,如下(JSP):response.setDateHeader("Expires",0); 

 

下面是一個HTTP響應的例子:

HTTP/1.1 200 OK

 

Server:Apache Tomcat/5.0.12

Date:Mon,6Oct2003 13:23:42 GMT

Content-Length:112

http請求和http響應詳細解析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.