一、http介紹
http是一個基于請求/響應(yīng)模式的、無狀態(tài)的協(xié)議。即,瀏覽器與服務(wù)端連接之后,瀏覽器向服務(wù)器發(fā)送一個請求,服務(wù)器返回響應(yīng)信息之后,雙方的鏈接就被關(guān)閉。我們要知道,應(yīng)用層的http要使用傳輸層的tcp協(xié)議來完成。而tcp協(xié)議是通過“3次握手”建立連接,是面向連接的協(xié)議。默認(rèn)情況下,瀏覽器與web服務(wù)器上80端口監(jiān)聽的服務(wù)器程序建立tcp連接。
http1.0是典型的請求/響應(yīng)模式。為了減少服務(wù)器的開銷,http1.1默認(rèn)有“持續(xù)連接”的機(jī)制。通過這種機(jī)制,客戶端發(fā)送請求得到響應(yīng)后,連接不會馬上關(guān)閉,可以繼續(xù)發(fā)送請求,還可以流水線發(fā)送多個請求、而不用等待每一個響應(yīng)的到來。
二、uri和url
uri(統(tǒng)一資源標(biāo)識符)純粹是一種符號結(jié)構(gòu),用于指定構(gòu)成web資源的字符串的各個不同部分。而url(統(tǒng)一資源定位符)是一種特殊的uri,包含了用于查找某個資源的足夠信息。
uri是一種語義上的抽象概念,可以是絕對的,也可以是相對的,而url則必須提供足夠的信息來定位,所以,是絕對的,而通常說的relative url,則是針對另一個absolute url,本質(zhì)上還是絕對的。
三、http請求
格式如圖:(crlf表示回車符 換行符,不同顏色之間用空格隔開)
第一行叫做請求行。所以我們可以說http請求由請求行、消息報頭、請求正文組成。
1、請求行
如上,請求行以一個方法符號開頭,空格之后,一個請求uri,再空格,然后一個http版本,最后一個回車換行。
其中請求方法有如下幾種:
我們在瀏覽器地址欄直接輸入地址的時候,采用的就是get方法。
head方法一般用于測試超鏈接的有效性,因?yàn)樗皇钦埱箜憫?yīng)消息的報頭。消息報頭后面會講。
(http協(xié)議中,請求方法必須全部大寫)
2、請求正文
類似name=xxx&pwd=xxxx的內(nèi)容
四、http響應(yīng)
格式與http請求類似,如圖:
第一行叫做狀態(tài)行。所以我們可以說http響應(yīng)由狀態(tài)行、消息報頭、響應(yīng)正文組成。
1、狀態(tài)行
如上,狀態(tài)行由一個http版本,空格后,一個狀態(tài)碼,再空格,一個狀態(tài)碼的文本描述,最后一個回車換行構(gòu)成。
狀態(tài)代碼有3位數(shù)字組成,狀態(tài)描述給出了狀態(tài)代碼簡短的描述。狀態(tài)碼第一個數(shù)字定義了響應(yīng)的類別,有五種可能取值:
1xx:指示信息–表示請求已接收,繼續(xù)處理
2xx:成功–表示請求已被成功接收、理解、接受
3xx:重定向–要完成請求必須進(jìn)行更進(jìn)一步的操作
4xx:客戶端錯誤–請求有語法錯誤或請求無法實(shí)現(xiàn)
5xx:服務(wù)器端錯誤–服務(wù)器未能實(shí)現(xiàn)合法的請求
全部取值如下:
100——客戶必須繼續(xù)發(fā)出請求
101——客戶要求服務(wù)器根據(jù)請求轉(zhuǎn)換http協(xié)議版本
200——交易成功
201——提示知道新文件的url
202——接受和處理、但處理未完成
203——返回信息不確定或不完整
204——請求收到,但返回信息為空
205——服務(wù)器完成了請求,用戶代理必須復(fù)位當(dāng)前已經(jīng)瀏覽過的文件
206——服務(wù)器已經(jīng)完成了部分用戶的get請求
300——請求的資源可在多處得到
301——刪除請求數(shù)據(jù)
302——在其他地址發(fā)現(xiàn)了請求數(shù)據(jù)
303——建議客戶訪問其他url或訪問方式
304——客戶端已經(jīng)執(zhí)行了get,但文件未變化
305——請求的資源必須從服務(wù)器指定的地址得到
306——前一版本http中使用的代碼,現(xiàn)行版本中不再使用
307——申明請求的資源臨時性刪除
400——錯誤請求,如語法錯誤
401——請求授權(quán)失敗
402——保留有效chargeto頭響應(yīng)
403——請求不允許
404——沒有發(fā)現(xiàn)文件、查詢或url
405——用戶在request-line字段定義的方法不允許
406——根據(jù)用戶發(fā)送的accept拖,請求資源不可訪問
407——類似401,用戶必須首先在代理服務(wù)器上得到授權(quán)
408——客戶端沒有在用戶指定的餓時間內(nèi)完成請求
409——對當(dāng)前資源狀態(tài),請求不能完成
410——服務(wù)器上不再有此資源且無進(jìn)一步的參考地址
411——服務(wù)器拒絕用戶定義的content-length屬性請求
412——一個或多個請求頭字段在當(dāng)前請求中錯誤
413——請求的資源大于服務(wù)器允許的大小
414——請求的資源url長于服務(wù)器允許的長度
415——請求資源不支持請求項(xiàng)目格式
416——請求中包含range請求頭字段,在當(dāng)前請求資源范圍內(nèi)沒有range指示值,請求也不包含if-range請求頭字段
417——服務(wù)器不滿足請求expect頭字段指定的期望值,如果是代理服務(wù)器,可能是下一級服務(wù)器不能滿足請求
500——服務(wù)器產(chǎn)生內(nèi)部錯誤
501——服務(wù)器不支持請求的函數(shù)
502——服務(wù)器暫時不可用,有時是為了防止發(fā)生系統(tǒng)過載
503——服務(wù)器過載或暫停維修
504——關(guān)口過載,服務(wù)器使用另一個關(guān)口或服務(wù)來響應(yīng)用戶,等待時間設(shè)定值較長
505——服務(wù)器不支持或拒絕支請求頭中指定的http版本
消息報頭下面會講。
2、響應(yīng)正文
所謂響應(yīng)正文,就是服務(wù)器返回的資源的內(nèi)容。即整個html文件。
五、消息報頭
http請求和http響應(yīng)都有消息報頭。而消息報頭是由眾多報頭域組成。每一個報頭域都由名字 “:” 空格組成,消息報頭域的名字是大小寫無關(guān)的。
http消息報頭包括普通報頭、請求報頭、響應(yīng)報頭和實(shí)體報頭。
1、普通報頭:
在普通報頭中,有少數(shù)報頭域用于所有的請求和響應(yīng)消息,但并不用于被傳輸?shù)膶?shí)體,只用于傳輸?shù)南ⅰ?br>普通報頭包括:
常見的普通報頭:
1)cache-control
cache-control用于指定緩存指令,緩存指令是單向的(響應(yīng)中出現(xiàn)的緩存指令在請求中未必會出現(xiàn)),且是獨(dú)立的(一個消息的緩存指令不會影響另一個消息處理的緩存機(jī)制),http1.0使用的類似的報頭域?yàn)閜ragma。
請求時的緩存指令包括:no-cache(用于指示請求或響應(yīng)消息不能緩存)、no-store、max-age、max-stale、min-fresh、only-if-cached;
響應(yīng)時的緩存指令包括:public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage.
2)date
date普通報頭域表示消息產(chǎn)生的日期和時間
3)connection
connection普通報頭域允許發(fā)送指定連接的選項(xiàng)。例如指定連接是連續(xù),或者指定“close”選項(xiàng),通知服務(wù)器,在響應(yīng)完成后,關(guān)閉連接
2、請求報頭
請求報頭允許客戶端向服務(wù)器端傳遞請求的附加信息以及客戶端自身的信息。
請求報頭包括:
常見的請求報頭:
1)accept
accept請求報頭域用于指定客戶端接受哪些類型的信息。
2)accept-charset
accept-charset請求報頭域用于指定客戶端接受的字符集。如果在請求消息中沒有設(shè)置這個域,缺省是任何字符集都可以接受。
3)accept-encoding
accept-encoding請求報頭域類似于accept,但是它是用于指定可接受的內(nèi)容編碼。如果請求消息中沒有設(shè)置這個域服務(wù)器假定客戶端對各種內(nèi)容編碼都可以接受。
4)accept-language
accept-language請求報頭域類似于accept,但是它是用于指定一種自然語言如果請求消息中沒有設(shè)置這個報頭域,服務(wù)器假定客戶端對各種語言都可以接受。
5)authorization
authorizat