【HTTP請求 == 請求行 + 消息報頭 + 請求正文 】
請求行:Method Request-URL HTTP-Version CRLF
HTTP協議定義了許多與服務器交互的方法
① PUT:請求服務器存儲一個資源,並用Request-URL作為其標識。
【備注】1. 相對於POST是安全和冪等的(當操作沒達到預期,我們可以不斷重試,而不會對資源產生副作用。)
2. 創建操作可以使用POST,也可以使用PUT,區別在於POST是作用於一個集合資源之上(/articles)的,而PUT操作是作用在一個具體資源之上(/articles/123),再通俗點說,如果URL在客戶端確定,就用PUT,如果在服務器端確定,用POST,比如說很多資源使用數據庫自增主鍵作為標識信息,而創建的資源的標識信息到底是什么要服務端提供,這時就必須用POST。
② POST:在Request-URL所標識的資源后附加新的數據。
③ GET:請求由Request-URL所標識的資源。
④ HEAD:請求由Request-URL所標識資源的響應消息報頭。
⑤ DELETE:請求服務器刪除由Request-URL所標識的資源。
⑥ TRACE:請求服務器回送收到的請求信息,主要用於測試和診斷。
⑦ CONNECT:保留將來使用。
⑧ OPTIONS:請求查詢服務器的性能,或查詢與資源相關的選項和需求。
Request-URL :統一資源標識。
HTTP-Version:HTTP的版本。
CRLF:回車換行。(/r/n)
【HTTP響應 == 狀態行 + 消息報頭 + 響應正文】
狀態行 == HTTP-Version(協議版本) Status-Code(返回碼) Reason-Phrase(狀態描述) CRLF
狀態碼
- 1xx:指示信息--表示請求已接收,繼續處理。
- 2xx:成功--表示請求已被成功接收、理解、接受。
- 3xx:重定向--要完成請求必須進行更進一步的操作。
- 4xx:客戶端錯誤--請求由語法錯誤或請求無法實現。
- 5xx:服務器端錯誤--服務器未能實現合法的請求。
詳細
200 OK 客戶端請求成功
400 Bad Request 客戶端請求有語法錯誤
403 Forbidden 服務器收到請求,但拒絕提供服務。服務器通常會在響應正文中給出原因
404 Not Found 請求的資源不存在。例如,輸入了錯誤的URL
500 Internal Server Error 服務器發生不可預期的錯誤
503 Service Unavaliable 服務器當前不能處理客戶端請求,一段時間后,服務器可能會恢復正常。
消息報頭 : 包括通用報頭、請求報頭、響應報頭、實體報頭
通用報頭:
1. Cache-Control:指定請求和響應遵循的緩存機制。在請求消息或響應消息中設置並不會修改另一個消息處理過程中的緩存處理機制。請求時包含no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,響應時包含public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。
no-cache:指示請求或響應消息不能緩存,實際上是可以存儲在本地緩存區中的,只是在與原始服務器進行新鮮度驗證之前,緩存不能將其提供給客戶端使用。
no-store:緩存應該盡快從存儲器中刪除文檔的所有痕跡,因為其中可能會包含敏感信息。
max-age:緩存無法返回緩存時間長於max-age規定秒的文檔,若不超規定秒瀏覽器將不會發送對應的請求到服務器,數據由緩存直接返回;超過這一時間段才進一步由服務器決定是返回新數據還是仍由緩存提供。若同時還發送了max-stale指令,則使用期可能會超過其過期時間。
min-fresh:至少在未來規定秒內文檔要保持新鮮,接受其新鮮生命期大於其當前 Age 跟 min-fresh 值之和的緩存對象。
max-stale:指示客戶端可以接收過期響應消息,如果指定max-stale消息的值,那么客戶端可以接收過期但在指定值之內的響應消息。
only-if-cached:只有當緩存中有副本存在時,客戶端才會獲得一份副本。
Public:指示響應可被任何緩存區緩存,可以用緩存內容回應任何用戶。
Private:指示對於單個用戶的整個或部分響應消息,不能被共享緩存處理,只能用緩存內容回應先前請求該內容的那個用戶。
2. Pragma:實現特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1協議中,它的含義和Cache-Control:no-cache相同。
3.Connection:是否需要持久連接。
close:告訴Web服務器或代理服務器,完成本次請求的響應后,斷開連接,不要等待本次連接的后續請求。
Keepalive:告訴Web服務器或代理服務器,完成本次請求的響應后,保持連接,等待本次連接的后續請求。
Keep-Alive:如果瀏覽器請求保持連接,則該報頭表明希望Web服務器保持連接多長時間(秒)
4. Date:消息發送時間。
5. Transfer-Encoding:Web服務器表明自己對本響應消息體(不是消息體里面的對象)作了怎樣的編碼,比如是否分塊(chunked)
6. Via:列出從客戶端到OCS或者相反方向的響應經過了哪些代理服務器,他們用什么協議(和版本)發送的請求。
當客戶端請求到達第一個代理服務器時,該服務器會在自己發出的請求里面添加 Via 頭部,並填上自己的相關信息,當下一個代理服務器 收到第一個代理服務器的請求時, 會在自己發出的請求里面復制前一個代理服務器的請求的Via頭部,並把自己的相關信息加到后面,以此類推,當 OCS 收到最后一個代理服務器的請求時,檢查 Via 頭部, 就知道該請求所經過的路由。例如:Via:1.0 236-81.D07071953.sina.com.cn:80 (squid/2.6.STABLE13)
HTTP請求頭 :對請求頭域的擴展要求通訊雙方都支持,如果存在不支持的請求頭域,一般將會作為實體頭域處理。
1. Accept:告訴Web服務器自己接受什么介質類型,*/*表示任何類型。
2.Accept-Charset:瀏覽器告訴服務器自己能接收的字符集。
3.Accept-Encoding:瀏覽器申明自己接收的編碼方法,通常指定壓縮方法,是否支持壓縮,支持什么壓縮方法(gzip,deflate)
4.Accept-Language:瀏覽器申明自己接收的語言。語言與字符集的區別:中文是語言,中文有多種字符集,比如big5、gb2312、gbk等
5.Authorization:當客戶端接收來自Web服務器的WWW-Authenticate響應時,用該頭部回應自己的身份驗證信息給Web服務器。
6.If-Match:如果對象的Etag沒有改變,其實也就意味着對象沒有改變,才執行請求的動作,獲取文檔。
7.If-None-Match:如果對象的ETag改變了,其實也就意味着對象改變了,才執行請求的動作,獲取文檔。
8.If-Modified-Since:如果請求的對象在頭部指定的時間之后修改了,才執行請求的動作(比如返回對象),否則返回代碼304,告訴瀏覽器對象沒有被改變。
9.If-Unmodified-Since:如果請求的對象在頭部指定的時間之后沒被修改過,才執行請求的動作。
10.If-Range:瀏覽器告訴Web服務器,如果我請求的對象沒被改變,就把我缺少的部分給我,如果對象變了,就把整個對象給我。瀏覽器通過發送請求對象的ETag或者自己所知道的最后修改時間給Web服務器,讓其判斷對象是否改變了。總是跟Range頭部一起用。
11.Range:瀏覽器(比如Flashget多線程下載時)告訴Web服務器自己想取對象的哪部分。例如:Range:bytes=1173546
12.Proxy-Authenticate:代理服務器響應瀏覽器,要求提供代理身份驗證信息。
13.Proxy-Authorization:瀏覽器響應代理服務器的身份驗證請求,提供自己的身份信息。
14.Host:客戶端指定自己想訪問Web服務器的域名/IP地址和端口號
15.Referer:瀏覽器向Web服務器表明自己是從哪個網頁URL獲得當前請求中的網址/URL
16.User-Agent:瀏覽器表明自己的身份(是哪種瀏覽器)。例如:User-Agent:Mozilla/5.0(Window;U;Windows NT5.1;zh-CN;rv:1.8.1.14)Gecko/20080404 Firefox/2.0.0.14
HTTP響應頭 :對響應頭域的擴展要求通訊雙方都支持,如果存在不支持的響應頭域,一般將會作為實體頭域處理。
1. Age:當代理服務器用自己緩存的實體去響應請求時,用該頭部表明該實體從產生到現在經過了多長時間
2.Server:Web服務器表明自己是什么軟件及版本等信息。例如:Server:Apache/2.0.61(Unix)
3.Accept-Ranges:Web服務器表明自己是否接受獲取其某個實體的一部分(比如文件的一部分)的請求。Bytes:表示接受,none:表示不接受
4.Vary:Web服務器用該頭部的內容告訴Cache服務器,在什么條件下才能用本響應返回的對象響應后續的請求。假如源Web服務器在接到第一個請求消息時,其響應消息的頭部為:Content-Encoding:gzip:Vary:Content-Encoding,那么Cache服務器會分析后續請求消息的頭部,檢查其Accept-Encoding,是否跟先前響應的Vary頭部值一致,即是否使用相同的內容編碼方法,這樣就可防止Cache服務器用自己Cache里面壓縮后的實體響應給不具備解壓能力的瀏覽器。
5. WWW-Authenticate:這個響應報頭域必須被包含在401(未授權)響應消息中,當客戶端收到401響應消息,就要決定是否請求服務器對其進行驗證。如果要求服務器對其進行驗證,就可以發送一個包含了Authorization報頭域的請求,例如:WWW-Authenticate:Basic realm = "Basic Auth Test",從這個響應頭域,可知服務器端對我們請求的資源采用的是基本驗證機制。
6. X-Frame-Options: 有三個值: DENY 表示該頁面不允許在 frame 中展示, 即便是在相同域名的頁面
中嵌套也不允許。 SAMEORIGIN 表示該頁面可以在相同域名頁面的 frame 中展示。 ALLOW-FROM uri 表示
該頁面可以在指定來源的 frame 中展示
HTTP實體頭 :響應消息和請求消息都可以包含實體信息。
1. Allow:服務器支持哪些請求方法。(如GET、POST等)
2. Location:表示客戶應當去哪里提取文檔,用於將接收端定位到資源的位置(URL)上。Location通常不是直接設置的,而是通過HttpServletResponse的sendRedirect方法,該方法同時設置狀態代碼為302
3. Content-Base:解析主體中的相對URL時使用的基礎URL
4. Content-Encoding:Web服務器表明自己使用了什么壓縮方法(gzip,deflate)壓縮響應中的對象。
5. Content-Language:Web服務器告訴瀏覽器理解主體時最適宜的自然語言
6. Content-Length
7. Content-Location:資源實際所處的位置
8.Content-MD5:主體的MD5校驗和
9. Content-Range:實體頭用於指定整個實體中的一部分的插入位置,他也指示了整個實體的長度。在服務器向客戶返回一個部分響應,它必須描述響應覆蓋的范圍和整個實體長度。一般格式: Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth。例如,傳送頭500個字節次字段的形式:Content-Range:bytes0- 499/1234如果一個http消息包含此節(例如,對范圍請求的響應或對一系列范圍的重疊請求),Content-Range表示傳送的范圍,Content-Length表示實際傳送的字節數。
10.Content-Type:Web服務器告訴瀏覽器自己響應的對象的類型。例如:Content-Type:application/xml Content-Type:text/html;char
【詳細分類】
http://tool.oschina.net/commons/
http://www.cnblogs.com/52fhy/p/5436673.html
http://www.cnblogs.com/xiaozong/p/5732332.html
11.Etag:就是一個對象(比如URL)的標志值,就一個對象而言,比如一個html文件,如果被修改了,其ETag也會被修改,所以,ETag的作用跟Last-Modified的作用差不多,主要供Web服務器判斷一個對象是否改變了。比如前一次請求某個HTML文件時,獲得了其ETag,當這次又請求這個文件時,瀏覽器就會把先前獲得ETag值發給Web服務器,然后Web服務器會把這個ETag跟該文件的當前ETag進行對比,然后就知道這個文件有沒有改變了
12. Expires:Web服務器表明該實體將在什么時候過期,對於過期了的對象,只有在跟Web服務器驗證了其有效性后,才能用來響應客戶請求。
13. Last-Modified:Web服務器認為對象的最后修改時間,比如文件的最后修改時間,動態頁面的最后產生時間等等。
MIME
全稱Multipurpose Internet Mail Extensions,比較確切的中文名稱為“多用途互聯網郵件擴展”,設計的最初目的是為了在發送電子郵件時附加多媒體數據,讓郵件客戶程序能根據其類型進行處理。然而當它被HTTP協議支持后,意義更為顯著。使得HTTP傳輸的不僅是普通的文本,而變得豐富多彩。
超文本標記語言文本 .html text/html
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
GIF圖形 .gif image/gif
JPEG圖形 .jpeg , .jpg image/jpeg
au聲音文件 .au audio/basic
MIDI音樂文件 mid,.midi audio/midi,audio/x-midi
RealAudio音樂文件 .ra,.ram audio/x-pn-realaudio
MPEG文件 .mpg,.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tar
Internet中有一個專門組織IANA來確認標准的MIME類型,但Internet發展的太快,很多應用程序等不及IANA來確認使用的MIME類型為標准類型。因此以x-開頭來標識這個類別還沒有成為標准。只要客戶端和服務器共同承認這個MIME類型,即使不是標准的類型也沒關系,客戶端就能根據MIME類型,采用具體的處理手段來處理數據。而Web服務器和瀏覽器(包括操作系統)中,缺省都設置了標准的和常見的MIME類型,只有對於不常見的MIME類型,才需要同時設置服務器和客戶瀏覽器,以進行識別。
由於MIME類型與文檔的后綴相關,因此服務器使用文檔的后綴來區分不同文件的MIME類型,服務器中必須定義文檔后綴 和MIME類型之間的對應關系。而客戶程序從服務器上接收數據的時候,它只是從服務器接受數據流,並不了解文檔的名字,因此服務器必須使用附加信息來告訴 客戶程序數據的MIME類型。服務器在發送真正的數據之前,就要先發送標志數據的MIME類型的信息,這個信息使用Content-type關鍵字進行定 義,例如對於HTML文檔,服務器將首先發送以下兩行MIME標識信息,這個標識並不是真正的數據文件的一部分。
Content-type: text/html
注意,第二行為一個空行,這是必須的,使用這個空行的目的是將MIME信息與真正的數據內容分隔開。