什么是Http協(xié)議
超文本傳輸協(xié)議(英文:HyperText Transfer Protocol,縮寫(xiě):HTTP)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。設(shè)計(jì)HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁(yè)面的方法。其實(shí),我們平時(shí)瀏覽的網(wǎng)頁(yè)就是基于 HTTP 協(xié)議呈現(xiàn)的,HTTP 協(xié)議是互聯(lián)網(wǎng)應(yīng)用中,客戶端(瀏覽器)與服務(wù)器之間進(jìn)行數(shù)據(jù)通信的一種協(xié)議。協(xié)議中規(guī)定了客戶端應(yīng)該按照什么格式給服務(wù)器發(fā)送請(qǐng)求,同時(shí)也約定了服務(wù)端返回的響應(yīng)結(jié)果應(yīng)該是什么格式。
Http請(qǐng)求結(jié)構(gòu)
HTTP請(qǐng)求由3部分組成,分別是請(qǐng)求行、請(qǐng)求首部、請(qǐng)求體,首部和請(qǐng)求體是可選的,并不是每個(gè)請(qǐng)求都需要的。
請(qǐng)求行
請(qǐng)求行是每個(gè)請(qǐng)求必不可少的部分,它由3部分組成,分別是請(qǐng)求方法(method)、請(qǐng)求URL(URI)、HTTP協(xié)議版本,以空格隔開(kāi)。請(qǐng)求首部
因?yàn)檎?qǐng)求行所攜帶的信息量非常有限,以至于客戶端還有很多想向服務(wù)器要說(shuō)的事情不得不放在請(qǐng)求首部(Header),請(qǐng)求首部用于給服務(wù)器提供一些額外的信息,比如 User-Agent 用來(lái)表明客戶端的身份,讓服務(wù)器知道你是來(lái)自瀏覽器的請(qǐng)求還是爬蟲(chóng),是來(lái)自 Chrome 瀏覽器還是 FireFox。請(qǐng)求體
請(qǐng)求體是客戶端提交給服務(wù)器的真正內(nèi)容,比如用戶登錄時(shí)的需要用的用戶名和密碼,比如文件上傳的數(shù)據(jù),比如注冊(cè)用戶信息時(shí)提交的表單信息。
HTTP請(qǐng)求方法
根據(jù)HTTP標(biāo)準(zhǔn),HTTP請(qǐng)求可以使用多種請(qǐng)求方法。
HTTP1.0定義了三種請(qǐng)求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五種請(qǐng)求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

URL概述
統(tǒng)一資源定位符(URL,英語(yǔ) Uniform / Universal Resource Locator的縮寫(xiě))是用于完整地描述Internet上網(wǎng)頁(yè)和其他資源的地址的一種標(biāo)識(shí)方法。
URL格式:schema://host[:port#]/path/…/[?query-string][#anchor]
- schema 協(xié)議(例如:http, https, ftp)
- host 服務(wù)器的IP地址或者域名
- port# 服務(wù)器的端口(如果是走協(xié)議默認(rèn)端口,缺省端口80)
- path 訪問(wèn)資源的路徑
- query-string 參數(shù),發(fā)送給http服務(wù)器的數(shù)據(jù)
- anchor- 錨(跳轉(zhuǎn)到網(wǎng)頁(yè)的指定錨點(diǎn)位置)
常用的請(qǐng)求報(bào)頭

- Host
Host初始URL中的主機(jī)和端口,用于指定被請(qǐng)求資源的Internet主機(jī)和端口號(hào),它通常從HTTP URL中提取出來(lái)的. - Connection
表示客戶端與服務(wù)連接類(lèi)型;
交互步驟:
1.client 發(fā)起一個(gè)包含Connection:keep-alive的請(qǐng)求
2.server收到請(qǐng)求后,如果server支持keepalive,回復(fù)一個(gè)包含Connection:keep-alive的響應(yīng),不關(guān)閉連接。否則回復(fù)一個(gè)包含Connection:close的響應(yīng),關(guān)閉連接。
3.如果client收到包含Connection:keep-alive的響應(yīng),向同一個(gè)連接發(fā)送下一個(gè)請(qǐng)求,直到一方主動(dòng)關(guān)閉連接。Keep-alive在很多情況下能夠重用連接,減少資源消耗,縮短響應(yīng)時(shí)間HTTP。 - Accept
表示瀏覽器支持的 MIME 類(lèi)型
MIME的英文全稱(chēng)是 Multipurpose Internet Mail Extensions(多用途互聯(lián)網(wǎng)郵件擴(kuò)展)
eg:
Accept:image/gif,表明客戶端希望接受GIF圖象格式的資源;
Accept:text/html,表明客戶端希望接受html文本。
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
意思:瀏覽器支持的 MIME 類(lèi)型分別是 text/html、application/xhtml+xml、application/xml 和 */*,優(yōu)先順序是它們從左到右的排列順序。
Text:用于標(biāo)準(zhǔn)化地表示的文本信息,文本消息可以是多種字符集和或者多種格式的;
Application:用于傳輸應(yīng)用程序數(shù)據(jù)或者二進(jìn)制數(shù)據(jù);

- Content-Type
POST 提交,application/x-www-form-urlencoded
提交的數(shù)據(jù)按照 key1=val1&key2=val2 的方式進(jìn)行編碼,key 和 val 都進(jìn)行了 URL 轉(zhuǎn)碼。 - User-Agent
瀏覽器類(lèi)型 - Referer
請(qǐng)求來(lái)自哪個(gè)頁(yè)面,用戶是從該 Referer URL頁(yè)面訪問(wèn)當(dāng)前請(qǐng)求的頁(yè)面。 - Accept-Encoding
瀏覽器支持的壓縮編碼類(lèi)型,比如gzip,支持gzip的瀏覽器返回經(jīng)gzip編碼的HTML頁(yè)面。 - Accept-Language
瀏覽器所希望的語(yǔ)言種類(lèi),當(dāng)服務(wù)器能夠提供一種以上的語(yǔ)言版本時(shí)要用到。
eg:
Accept-Language:zh-cn
如果請(qǐng)求消息中沒(méi)有設(shè)置這個(gè)報(bào)頭域,服務(wù)器假定客戶端對(duì)各種語(yǔ)言都可以接受。
- Accept-Charset
瀏覽器可接受的字符集,用于指定客戶端接受的字符集
eg:
Accept-Charset:iso-8859-1,gb2312
ISO8859-1,通常叫做Latin-1。Latin-1包括了書(shū)寫(xiě)所有西方歐洲語(yǔ)言不可缺少的附加字符;
gb2312是標(biāo)準(zhǔn)中文字符集;
UTF-8 是 UNICODE 的一種變長(zhǎng)字符編碼,可以解決多種語(yǔ)言文本顯示問(wèn)題,從而實(shí)現(xiàn)應(yīng)用國(guó)際化和本地化。
如果在請(qǐng)求消息中沒(méi)有設(shè)置這個(gè)域,缺省是任何字符集都可以接受。
Cache 頭域
If-Modified-Since
作用: 把瀏覽器端緩存頁(yè)面的最后修改時(shí)間發(fā)送到服務(wù)器去,服務(wù)器會(huì)把這個(gè)時(shí)間與服務(wù)器上實(shí)際文件的最后修改時(shí)間進(jìn)行對(duì)比。如果時(shí)間一致,那么返回304,客戶端就直接使用本地緩存文件。如果時(shí)間不一致,就會(huì)返回200和新的文件內(nèi)容??蛻舳私拥街?,會(huì)丟棄舊文件,把新文件緩存起來(lái),并顯示在瀏覽器中.Pragma
作用: 防止頁(yè)面被緩存, 在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一樣+
Pargma只有一個(gè)用法, 例如: Pragma: no-cache
注意: 在HTTP/1.0版本中,只實(shí)現(xiàn)了Pragema:no-cache, 沒(méi)有實(shí)現(xiàn)Cache-ControlLast-Modified與ETag
Last-Modified與ETag是可以一起使用的,服務(wù)器會(huì)優(yōu)先驗(yàn)證ETag,一致的情況下,才會(huì)繼續(xù)比對(duì)Last-Modified,最后才決定是否返回304。因?yàn)閘ast-modified只能精確到秒級(jí) 所以etag才比last-modified的優(yōu)先級(jí)高。
Http響應(yīng)結(jié)構(gòu)
服務(wù)端接收請(qǐng)求并處理后,返回響應(yīng)內(nèi)容給客戶端,同樣地,響應(yīng)內(nèi)容也必須遵循固定的格式瀏覽器才能正確解析。HTTP 響應(yīng)也由3部分組成,分別是:響應(yīng)行、響應(yīng)首部、響應(yīng)體,與HTTP的請(qǐng)求格式是相對(duì)應(yīng)的。
- 響應(yīng)行
響應(yīng)行同樣也是3部分組成,由服務(wù)端支持的 HTTP 協(xié)議版本號(hào)、狀態(tài)碼、以及對(duì)狀態(tài)碼的簡(jiǎn)短原因描述組成。狀態(tài)碼是響應(yīng)行中很重要的一個(gè)字段。通過(guò)狀態(tài)碼,客戶端可以知道服務(wù)器是否正常處理的請(qǐng)求。如果狀態(tài)碼是200,說(shuō)明客戶端的請(qǐng)求處理成功,如果是500,說(shuō)明服務(wù)器處理請(qǐng)求的時(shí)候出現(xiàn)了異常。404 表示請(qǐng)求的資源在服務(wù)器找不到。除此之外,HTTP 協(xié)議還很定義了很多其他的狀態(tài)碼。 - 響應(yīng)首部
響應(yīng)首部和請(qǐng)求首部類(lèi)似,用于對(duì)響應(yīng)內(nèi)容的補(bǔ)充,在首部里面可以告知客戶端響應(yīng)體的數(shù)據(jù)類(lèi)型是什么?響應(yīng)內(nèi)容返回的時(shí)間是什么時(shí)候,響應(yīng)體是否壓縮了,響應(yīng)體最后一次修改的時(shí)間。 - 響應(yīng)體
響應(yīng)體(body)是服務(wù)器返回的真正內(nèi)容,它可以是一個(gè)HTML頁(yè)面,或者是一張圖片、一段視頻等等。
所有HTTP響應(yīng)的第一行都是狀態(tài)行,依次是當(dāng)前HTTP版本號(hào),3位數(shù)字組成的狀態(tài)代碼,以及描述狀態(tài)的短語(yǔ),彼此由空格分隔。 狀態(tài)代碼的第一個(gè)數(shù)字代表當(dāng)前響應(yīng)的類(lèi)型
1xx消息——請(qǐng)求已被服務(wù)器接收,繼續(xù)處理
2xx成功——請(qǐng)求已成功被服務(wù)器接收、理解、并接受
3xx重定向——需要后續(xù)操作才能完成這一請(qǐng)求
4xx請(qǐng)求錯(cuò)誤——請(qǐng)求含有詞法錯(cuò)誤或者無(wú)法被執(zhí)行
5xx服務(wù)器錯(cuò)誤——服務(wù)器在處理某個(gè)正確請(qǐng)求時(shí)發(fā)生錯(cuò)誤
常見(jiàn)狀態(tài)代碼、狀態(tài)描述、說(shuō)明:
◆200 (OK): 找到了該資源,并且一切正常。
◆301(Moved Permanently): 客戶請(qǐng)求的文檔在其他地方,新的URL在Location頭中給出,瀏覽器應(yīng)該自動(dòng)地訪問(wèn)新的URL。
◆302 (Found): 類(lèi)似于301,但新的URL應(yīng)該被視為臨時(shí)性的替代,而不是永久性的。
◆304 (NOT MODIFIED): 該資源在上次請(qǐng)求之后沒(méi)有任何修改。這通常用于瀏覽器的緩存機(jī)制。
◆400 (Bad Request): 請(qǐng)求出現(xiàn)語(yǔ)法錯(cuò)誤。
◆403 (FORBIDDEN): 客戶端未能獲得授權(quán)。這通常是在401之后輸入了不正確的用戶名或密碼。
◆404 (NOT FOUND): 在指定的位置不存在所申請(qǐng)的資源。
◆500 (Internal Server Error): 服務(wù)器遇到了意料不到的情況,不能完成客戶的請(qǐng)求
◆503 (Service Unavailable): 服務(wù)器由于維護(hù)或者負(fù)載過(guò)重未能應(yīng)答。例如,Servlet可能在數(shù)據(jù)庫(kù)連接池已滿的情況下返回503。服務(wù)器返回503時(shí)可以提供一個(gè)Retry-After頭
詳細(xì)的狀態(tài)碼信息:http://www.runoob.com/http/http-status-codes.html
延伸閱讀
《圖解HTTP》
《HTTP權(quán)威指南》
HTTP Request:https://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5