網絡基本功(二十二):細說HTTP(下)
轉載請在文首保留原文出處:EMC中文支持論壇https://community.emc.com/go/chinese
介紹
本文承接上文。
更多信息
HTTP回覆信息:
每一個HTTP客戶端發送給服務器請求都會要求服務器發回響應信息。在特定情況下,服務器會發回兩條響應,一條初步響應和一條實際上的響應。一般,一個請求產生一個響應,表明服務器對於該請求的處理結果,並且響應往往消息主體還攜帶一個實體(文件或資源)。(微信號:EMC_Support)
響應消息格式如下:
<狀態行>
<響應首部>
<響應實體>
如下圖所示。
狀態行
狀態行是響應信息的起始行,作用有兩個:告知客戶端服務器使用的協議版本以及溝通客戶端請求的處理結果。狀態行語法格式如下:
<HTTP-VERSION><status-code><reason-phrase>
HTTP版本
狀態行中的HTTP-VERSION標籤與請求信息中的目的一樣。服務器要求返回的版本號不得高於客戶端發送的版本號。
響應碼和文本描述
狀態碼和文本描述提供客戶端請求處理結果的信息。服務器通過3位數字狀態碼告知客戶端處理結果。目的是爲了方便客戶端HTTP軟件採取合適的行動。文本描述將服務器響應顯示給客戶端用戶。
狀態代碼由 3 位數字組成, 表示請求是否被理解或被滿足,狀態描述給出了關於狀態碼的簡短的文字描述。狀態碼的第一個數字定義了響應類別,後面兩位數字沒有具體分類。第一個數字有5 種取值,如下所示。
1xx:指示信息——表示請求已經接受,繼續處理
2xx:成功——表示請求已經被成功接收、理解、接受。
3xx:重定向——要完成請求必須進行更進一步的操作
4xx:客戶端錯誤——請求有語法錯誤或請求無法實現
5xx:服務器端錯誤——服務器未能實現合法的請求。
常見狀態代碼、狀態描述、說明:
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized //請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用
403 Forbidden //服務器收到請求,但是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務器發生不可預期的錯誤
503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常
響應首部
響應首部可能包括:
Location(重定向)
Location響應報頭域用於重定向接受者到一個新的位置。例如:客戶端所請求的頁面已不存在原先的位置,爲了讓客戶端重定向到這個頁面新的位置,服務器端可以發回Location響應報頭後使用重定向語句,讓客戶端去訪問新的域名所對應的服務器上的資源。當我們在JSP中使用重定向語句的時候,服務器端向客戶端發回的響應報頭中,就會有Location響應報頭域。
Server響應頭
Server響應頭包含處理請求的原始服務器的軟件信息。此域能包含多個產品標識和註釋,產品標識一般按照重要性排序。它和User-Agent請求報頭域是相對應的,前者發送服務器端軟件的信息,後者發送客戶端軟件(瀏覽器)和操作系統的信息。下面是Server響應報頭域的一個例子:Server: Apache-Coyote/1.1
實體頭
請求消息和響應消息都可以包含實體信息,實體信息一般由實體頭域和實體組成。實體頭域包含關於實體的原信息,實體頭包括Allow、Content- Base、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、 Etag、Expires、Last-Modified、extension-header。extension-header允許客戶端定義新的實體頭,但是這些域可能無法未接受方識別。實體可以是一個經過編碼的字節流,它的編碼方式由Content-Encoding或Content-Type定義,它的長度由Content-Length或Content-Range定義。
Content-Type實體頭用於向接收方指示實體的介質類型,指定HEAD方法送到接收方的實體介質類型,或GET方法發送的請求介質類型,如:"application/octet-stream"。
Last-modified:實體頭指定服務器上保存內容的最後修訂時間。
Accept-Ranges:這個字段說明Web服務器是否支持Range(是否支持斷點續傳功能),如果支持,則返回Accept-Ranges: bytes,如果不支持,則返回Accept-Ranges: none。
Content-Encoding:文檔的編碼(Encode)方法。它的值指示了已經被應用到實體正文的附加內容編碼,因而要獲得Content- Type報頭域中所引用的媒體類型,必須採用相應的解碼機制。Content-Encoding主要用語記錄文檔的壓縮方法,下面是它的一個例子: Content-Encoding: gzip。如果一個實體正文采用了編碼方式存儲,在使用之前就必須進行解碼。
Expires: 給出響應過期的日期和時間。通常,代理服務器或瀏覽器會緩存一些頁面。當用戶再次訪問這些頁面時,直接從緩存中加載並顯示給用戶,這樣縮短了響應的時間,減少服務器的負載。爲了讓代理服務器或瀏覽器在一段時間後更新頁面,我們可以使用Expires實體報頭域指定頁面過期的時間。當用戶又一次訪問頁面時,如果Expires報頭域給出的日期和時間比Date普通報頭域給出的日期和時間要早(或相同),那麼代理服務器或瀏覽器就不會再使用緩存的頁面而是從服務器上請求更新的頁面。不過要注意,即使頁面過期了,也並不意味着服務器上的原始資源在此時間之前或之後發生了改變。
Refresh:表示瀏覽器應該在多少時間之後刷新文檔,以秒計。除了刷新當前文檔之外,你還可以通過setHeader("Refresh", "5; URL=http://host/path")讓瀏覽器讀取指定的頁面。 注意這種功能通常是通過設置HTML頁面HEAD區的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">實現。
Allow:服務器支持哪些請求方法(如GET、POST等)。
Content-Disposition:打開一個網頁時,瀏覽器會首先看是否有Content-Disposition: p_w_upload這一項,當是“Content-Disposition: p_w_upload”時是下載,“Content-Disposition:inline”是在線打開文件
下面是一個響應消息
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
HTTP方法:
GET
GET方法請求服務器檢索由該HTTP請求中的URL指定的資源並在回覆中發給客戶端。這是最基本的請求類型,也是佔大多數的HTTP數據流。當你輸入一個常規URL或點擊一個文檔中的鏈接,通常就是提示Web瀏覽器發送GET請求。
對於GET的處理取決於若干因素。如果URL正確並且服務器能夠找到資源,會發送合適的響應給客戶端。返回資源需取決於請求對象的特性。如果無法妥當處理請求,則會產生一個錯誤信息。在使用緩存的情況下,代理服務器甚至客戶端自己就可以滿足請求。對於某種特定報頭如 If-Modified-Since 或 If-Match, GET請求的含義可能隨之而改變,要求服務器僅在滿足特定條件時發送資源。這類請求稱爲條件GET。類似的,客戶端可以使用Range頭來要求服務器僅發送部分資源。這類請求稱爲部分GET。
HEAD
HEAD方法同GET,但告知服務器不要發送消息實體。客戶端通常使用這種方法來檢查資源是否存在,狀態,或文件大小,再決定是否需要服務器發送整個文件。HEAD請求的處理與GET相同,除了只返回頭部而不返回實際的資源之外。
POST
POST方法允許客戶端發送任意數據的實體到服務器以進行處理。它通常同於客戶端提交例如交互式HTML信息給服務器程序,之後服務器作出行動併發迴響應。這種方法用於各種在線進程。請求中的URL指定服務器上接受數據的程序名。
PUT
這種方法請求服務器將請求中的實體保存在請求中的URL裏。PUT中,URI指明請求中的實體,因而PUT能夠讓文件複製到服務器,在GET請求中文件能夠被複制到客戶端。與之相反,POST中URI標識的程序處理請求中的實體,因此通常應用於交互式程序。PUT用法很多,如上傳內容到網站,這種情況下必須加以認證。但是,在站點上存儲文件通常使用其他方式,如FTP。
TRACE
客戶端通過這種方法接收發至服務器的請求,用於診斷目的。