超文本傳輸協議(HTTP,HyperText Transfer PRotocol)是互聯網上應用最為廣泛的一種網絡協議。所有的WWW文件都必須遵守這個標準。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。1960年美國人Ted Nelson構思了一種通過計算機處理文本信息的方法,并稱之為超文本(hypertext),這成為了HTTP超文本傳輸協議標準架構的發展根基。Ted Nelson組織協調萬維網協會(World Wide Web Consortium)和互聯網工程工作小組(Internet Engineering Task Force )共同合作研究,最終發布了一系列的RFC,其中著名的RFC 2616定義了HTTP 1.1。(百度百科) HTTP是一個屬于應用層的面向對象的協議,由于其簡捷、快速的方式,適用于分布式超媒體信息系統。
http請求由三部分組成,分別是:請求行、消息報頭、請求正文
請求行
格式:Method(方法符號) Request-URI(請求的URI) HTTP-Version(協議的版本) CRLF(回車和換行) 注:除了作為結尾的CRLF外,不允許出現單獨的CR或LF字符。
方法符號(大寫): GET:請求獲取Request-URI所標識的資源 POST:在Request-URI所標識的資源后附加新的數據 HEAD:請求獲取由Request-URI所標識的資源的響應消息報頭 PUT: 請求服務器存儲一個資源,并用Request-URI作為其標識 DELETE:請求服務器刪除Request-URI所標識的資源 TRACE:請求服務器回送收到的請求信息,主要用于測試或診斷 CONNECT:保留將來使用 OPTIONS:請求查詢服務器的性能,或者查詢與資源相關的選項和需求
消息報頭
Accept:瀏覽器可接受的MIME類型。Accept - Charset:瀏覽器可接受的字符集。Accept - Encoding:瀏覽器能夠進行解碼的數據編碼方式,比如gzip。Servlet能夠向支持gzip的瀏覽器返回經gzip編碼的HTML頁面。許多情形下這可以減少5到10倍的下載時間。Accept - Language:瀏覽器所希望的語言種類,當服務器能夠提供一種以上的語言版本時要用到。Authorization:授權信息,通常出現在對服務器發送的WWW - Authenticate頭的應答中。Connection:表示是否需要持久連接。如果Servlet看到這里的值為“Keep - Alive”,或者看到請求使用的是HTTP 1.1(HTTP 1.1默認進行持久連接),它就可以利用持久連接的優點,當頁面包含多個元素時(例如Applet,圖片),顯著地減少下載所需要的時間。要實現這一點,Servlet需要在應答中發送一個Content - Length頭,最簡單的實現方法是:先把內容寫入ByteArrayOutputStream,然后在正式寫出內容之前計算它的大小。Content - Length:表示請求消息正文的長度。Cookie:這是最重要的請求頭信息之一。From:請求發送者的email地址,由一些特殊的Web客戶程序使用,瀏覽器不會用到它。Host:初始URL中的主機和端口。If - Modified - Since:只有當所請求的內容在指定的日期之后又經過修改才返回它,否則返回304“Not Modified”應答。Pragma:指定“no - cache”值表示服務器必須返回一個刷新后的文檔,即使它是代理服務器而且已經有了頁面的本地拷貝。Referer:包含一個URL,用戶從該URL代表的頁面出發訪問當前請求的頁面。User - Agent:瀏覽器類型,如果Servlet返回的內容與瀏覽器類型有關則該值非常有用。UA - Pixels,UA - Color,UA - OS,UA - CPU:由某些版本的IE瀏覽器所發送的非標準的請求頭,表示屏幕大小、顏色深度、操作系統和CPU類型。請求正文:也就是我們發送的數據實例
POST /reg.jsp HTTP/1.1(CRLF) // 請求行HOST: www.guet.edu.cn(CRLF) // 消息報頭Accept:image/gif,image/x-xbit,…(CRLF)Content-Length:22(CRLF)Connection:Keep-Alive(CRLF)Cache-Control:no-cache(CRLF)…(CRLF) // CRLF表示回車和換行user=jeffrey&pwd=1234 // 消息正文…HTTP響應也是由三個部分組成,分別是:狀態行、消息報頭、響應正文
狀態行
格式:HTTP-Version(協議的版本) Status-Code(響應狀態代碼) Reason-Phrase(狀態代碼的文本描述) CRLF(回車和換行) 狀態碼:三位數字組成,第一個數字定義了響應的類別。 1xx:指示信息–表示請求已接收,繼續處理 2xx:成功–表示請求已被成功接收、理解、接受 3xx:重定向–要完成請求必須進行更進一步的操作 4xx:客戶端錯誤–請求有語法錯誤或請求無法實現 5xx:服務器端錯誤–服務器未能實現合法的請求 詳細請看:(HTTP狀態碼詳解)http://tool.oschina.net/commons?type=5消息報頭: Location:重定向接受者到一個新的位置。Server:包含了服務器用來處理請求的軟件信息。它和User-Agent請求報頭域是相對應的,前者發送服務器端軟件的信息,后者發送客戶 端軟件(瀏覽器)和操作系統的信息。例如:Server: Apache-Coyote/1.1WWW-Authenticate:必須被包含在401(未授權的)響應消息中,這個報頭域和前面講到的Authorization請求報頭域是相關的,當客戶端收到401響應消息,就要決定是否請求服務器對其進行驗證。如果要求服務器對其進行驗證,就可以發送一個包含了 Authorization報頭域的請求。例如:WWW-Authenticate: Basic realm=”Basic Auth Test!”。從這個響應報頭域,可以知道服務器端對我們所請求的資源采用的是基本驗證機制。Content-Encoding:用作媒體類型的修飾符,它的值指示了已經被應用到實體正文的附加內容編碼,因而要獲得Content- Type報頭域中所引用的媒體類型,必須采用相應的解碼機制。例如: Content-Encoding: gzip。如果一個實體正文采用了編碼方式存儲,在使用之前就必須進行解碼。Content-Language:描述了資源所用的自然語言。Content-Length:指明正文的長度,以字節方式存儲的十進制數字來表示,也就是一個數字字符占一個字節,用其對應的ASCII碼存儲傳輸。注:這個長度僅僅是表示實體正文的長度,沒有包括實體報頭的長度。Content-Type:指明發送給接收者的實體正文的媒體類型。例如:Content-Type: text/html;charset=ISO-8859-1Last-Modified:指示資源最后的修改日期及時間。Expires:給出響應過期的日期和時間。日期和時間必須是RFC 1123中的日期格式,例如:Expires: Thu, 15 Sep 2005 16:00:00 GMT。 HTTP1.1的客戶端和緩存必須將其他非法的日期格式(也包括0)看作已過期。例如,為了讓瀏覽器不要緩存頁面,我們也可以利用Expires實體報頭 域,設置它的值為0,如下(JSP):response.setDateHeader(“Expires”,0);消息正文例如:
HTTP/1.1 200 OK //狀態行Server: nginxDate: Tue, 31 May 2016 02:09:24 GMTContent-Type: application/json;charset=UTF-8Connection: keep-aliveVary: Accept-Encodingaccess-Control-Allow-Origin: *Access-Control-Allow-Headers: X-Requested-With,access_token,access-token,content-type,multipart/form-data,application/x-www-form-urlencodedAccess-Control-Allow-Methods: GET,POST,OPTIONS Content-Length: 49
{“resultCode”:1,”resultMsg”:”手機號未注冊”} //正文
通用頭域:通用頭域包含請求和響應消息都支持的頭域,通用頭域包含Cache-Control、 Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。對通用頭域的擴展要求通訊雙方都支持此擴展,如果存在不支持的通用頭域,一般將會作為實體頭域處理。
Cache-Control頭域:指定請求和響應遵循的緩存機制。在請求消息或響應消息中設置 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。各個消息中的指令含義如下: 1、Public指示響應可被任何緩存區緩存。 2、Private指示對于單個用戶的整個或部分響應消息,不能被共享緩存處理。 3、no-cache指示請求或響應消息不能緩存 4、no-store用于防止重要的信息被無意的發布。在請求消息中發送將使得請求和響應消息都不使用緩存。 5、max-age指示客戶機可以接收生存期不大于指定時間(以秒為單位)的響應。 6、min-fresh指示客戶機可以接收響應時間小于當前時間加上指定時間的響應。 7、max-stale指示客戶機可以接收超出超時期間的響應消息。如果指定max-stale消息的值,那么客戶機可以接收超出超時期指定值之內的響應消息。 Date頭域:表示消息發送的時間,時間的描述格式由rfc822定義。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的時間表示世界標準時,換算成本地時間,需要知道用戶所在的時區。Pragma頭域:用來包含實現特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1協議中,它的含義和Cache- Control:no-cache相同。參考:(HTTP協議詳解(真的很經典))http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html
未完待續。。。。。。
新聞熱點
疑難解答