- HTTP 是什么
- URL 詳解
- HTTP 之請求篇
- HTTP 之響應(yīng)篇

一、HTTP是什么
1、概述</br>
HTTP 全稱是 <em style="color:red">HyperText Transfer Protocal </em>,即:超文本傳輸協(xié)議,從 1990 年開始就在 WWW 上廣泛應(yīng)用,是現(xiàn)今在 WWW 上應(yīng)用最多的協(xié)議,HTTP 是應(yīng)用層協(xié)議,當(dāng)你上網(wǎng)瀏覽網(wǎng)頁的時候,瀏覽器和 web 服務(wù)器之間就會通過 HTTP 在 Internet 上進(jìn)行數(shù)據(jù)的發(fā)送和接收。HTTP 是一個基于請求/響應(yīng)模式的、無狀態(tài)的協(xié)議。即我們通常所說的 <em style="color:red">Request/Response</em>
http 協(xié)議簇

2、特點
支持客戶端/服務(wù)器模式</br>
簡單快速:客戶向服務(wù)器請求服務(wù)時,只需傳送請求方法和路徑。由于HTTP 協(xié)議簡單,使得HTTP 服務(wù)器的程序規(guī)模小,因而通信速度很快
靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對象。正在傳輸?shù)念愋陀?Content-Type 加以標(biāo)記
無連接:無連接的含義是限制每次鏈接只處理一個請求。服務(wù)器處理完哭護(hù)的請求,并收到客戶的應(yīng)答后,即斷開鏈接,采用這種方式可以節(jié)省傳輸時間
無狀態(tài):HTTP 協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事物處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能會導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時它的應(yīng)答就較快
二、URL詳解
1、簡介
<em style="color:red">URL(Uniform Resource Locator)</em>是統(tǒng)一資源定位符的簡稱,有時候也被俗稱為網(wǎng)頁地址(網(wǎng)址),如同是網(wǎng)絡(luò)上的門牌,是因特網(wǎng)上標(biāo)準(zhǔn)的資源的地址
2、基本組成
通用的格式:<em style="color:red">schema://host[:port#]/path/…/[?query-string][#anchor]</em>
| 名稱 | 功能 |
|---|---|
| schema | 訪問服務(wù)器以獲取資源時要使用哪種協(xié)議,比如,http,https 和 FTP 等 |
| host | HTTP 服務(wù)器的 IP 地址或域名 |
| port | HTTP 服務(wù)器的默認(rèn)端口是 80,這種情況下端口號可以省略,如果使用了別的端口,必須指明,例如http://www.cnblogs.com:8080 |
| path | 訪問資源的路徑 |
| query-string | 發(fā)給 http 服務(wù)器的數(shù)據(jù) |
| anchor | 錨 |
舉個例子:http://www.mywebsite.com/sj/test/test.aspx?name=sviergn&x=true#stuff 其中
| 名稱 | 功能 |
|---|---|
| Schema | http |
| host | www.mywebsite.com |
| path | /js/test/test.aspx |
| Query-string | name=sviergn&x=true |
| anchor | stuff |
再來張比較直觀的圖
三、HTTP 之請求篇
HTTP 的請求報文分為三個部分, <em style="color:red">請求行、請求頭、請求體</em>
!
1、請求行</br>
請求行(Request line)分為三個部分:請求方法、請求地址和協(xié)議版本
請求方法
<em style="color:red">HTTP/1.1</em> 協(xié)議中共定義了八種方法(也叫“動作”)來以不同的方式操作指定的資源
| 方法名 | 功能 |
|---|---|
| GET | 向指定的資源發(fā)出“顯示”請求,使用 GET 方法應(yīng)該只用在讀取數(shù)據(jù)上,而不應(yīng)該用于產(chǎn)生“副作用”的操作中 |
| POST | 指定資源提交數(shù)據(jù),請求服務(wù)器進(jìn)行處理(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請求文本中。這個請求可能會創(chuàng)建新的資源或者修改現(xiàn)有資源,或兩者皆有。 |
| PUT | 向指定資源位置上傳其最新內(nèi)容 |
| DELETE | 請求服務(wù)器刪除 Request-URI 所標(biāo)識的資源 |
| OPTIONS | 使服務(wù)器傳回該資源所支持的所有HTTP請求方法。用*來代替資源名稱,向 Web 服務(wù)器發(fā)送 OPTIONS 請求,可以測試服務(wù)器功能是否正常運(yùn)作 |
| HEAD | 與 GET 方法一樣,都是向服務(wù)器發(fā)出指定資源的請求,只不過服務(wù)器將不傳回資源的本文部分,它的好處在于,使用這個方法可以在不必傳輸全部內(nèi)容的情況下,就可以獲取其中關(guān)于該資源的信息(原信息或稱元數(shù)據(jù)) |
| TRACE | 顯示服務(wù)器收到的請求,主要用于測試或診斷 |
| CONNECT | HTTP/1.1 中預(yù)留給能夠?qū)⑦B接改為通道方式的代理服務(wù)器。通常用于 SSL 加密服務(wù)器的鏈接(經(jīng)由非加密的 HTTP 代理服務(wù)器) |
其中,最常見的是 GET 和 POST 方法,如果是 RESful 接口的話一般會用到PUT、DELETE、GET、POST(分別對應(yīng)增刪查改),這里附上一篇有關(guān) REST 的文章 什么是 RES
2、請求頭
請求頭可用于傳遞一些附加信息,格式為:鍵: 值,注意冒號后面有一個空格:
請求和響應(yīng)常見通用的 Header
| 方法名 | 功能 |
|---|---|
| Content-Type | 請求體/響應(yīng)體的類型,如:text/plain、application/json |
| Accept | 說明接收的類型,可以多個值,用,(英文逗號)分開 |
| Content-length | 請求體/響應(yīng)體的長度,單位字節(jié) |
| Content-Encoding | 請求體/響應(yīng)體的編碼格式,如 gzip、deflate |
| Accept-Encoding | 告知對方我方接受的 Content-Encoding |
| ETag | 給當(dāng)前資源的標(biāo)識,和Last-Modified、If-None-Match、If-Modified-Since配合,用于緩存控制 |
| Cache-Control | 取值一般為no-cache、max-age=xx,xx為整數(shù),表示資源緩存有效期(秒) |
常見的請求 Header
| 方法名 | 功能 |
|---|---|
| Authorization | 用于設(shè)置身份認(rèn)證信息 |
| User-Agent | 用戶標(biāo)識,如:OS 和瀏覽器的類型和版本 |
| If-Modified-Since | 值為上一次服務(wù)器返回的Last-Modified值,用于確定某個資源是否被更改過,沒有更改過就從緩存中讀取 |
| If-None-Match | 值為上一次服務(wù)器返回的ETag 值,一般會和If-Modified-Since |
| Cookie | 已有的Cookie
|
| Referer | 標(biāo)識請求引用自哪個地址,比如你從頁面 A 跳轉(zhuǎn)到頁面 B 時,值為頁面 A 的地址 |
| Host | 請求的主機(jī)和端口號 |
請求體
請求體(又叫請求正文)是 post 請求方式中的請求參數(shù),以 key = value 形式進(jìn)行存儲,多個請求參數(shù)之間用&連接,如果請求當(dāng)中請求體,那么在請求頭當(dāng)中的 Content-Length 屬性記錄的就是該請求體的長度
根據(jù)應(yīng)用場景的不同,HTTP 請求的請求體有三種不同的形式
第一種:</br>
移動開發(fā)者常見的,請求體是任意類型的,服務(wù)器不會解析請求體,請求體的處理需要自己解析,如 <mark> POST/JSON </mark> 的時候就是這類
第二種:</br>
第二種和第三種都有固定的格式,是服務(wù)器端開發(fā)人員最先了解的兩種。這里的格式要求就是 URL 中 Query String 的格式要求:多個鍵值對之間用&連接,鍵與值之間用=連接,且只能用ASCII 字符,非ASCII 字符需使用UrlEncode編碼
第三種:</br>
第三種請求體被分成多個部分,文件上傳 時會被使用,這種格式最先是被用于郵件傳輸中,每個字段/文件都被 boundary(Content-Type中指定的)分成單獨的段,每段以--加boundary 開頭,然后是該段的描述頭,描述頭之后空一行接內(nèi)容,請求結(jié)束的標(biāo)識為boundary 后面加--
區(qū)分是否被當(dāng)成文件的關(guān)鍵是 Content-Disposition 是否包含filename,因為文件有不同的類型,所以還要使用 Content-Type 指示文件的類型,如果不知道是什么類型取值可以為 application/octet-stream 表示文件是一個二進(jìn)制的文件,如果不是文件則 Content-Type可以省略
四、HTTP 之響應(yīng)篇
HTTP 響應(yīng)的格式上除狀態(tài)行(第一行)與請求報文的請求行不一樣之外,其他的就格式而言是一樣的,但排除狀態(tài)行和請求行的區(qū)別,從 Header 上還是可以區(qū)分出 HTTP 請求和 HTTP 響應(yīng)的區(qū)別的,怎么區(qū)別就要看前面的 Header 啦
1、響應(yīng)狀態(tài)行
狀態(tài)碼
狀態(tài)碼(就是上圖中的響應(yīng)碼),如果想查看各種狀態(tài)碼具體的含義,可以看一下這篇文章HTTP狀態(tài)碼對照表,當(dāng)然這么多狀態(tài)碼要想全部都記住的話,還是比較困難的。
在平時我們只要記住這些就差不多了
狀態(tài)碼 對應(yīng)的信息
- 1XX 提示信息—表示請求已接收,繼續(xù)處理;
- 2XX 用于表示請求已被成功接收、理解、接收;
- 3XX 用于表示資源(網(wǎng)頁等)被永久轉(zhuǎn)移到其它 URL,也就是所謂的重定向;
- 4XX 客戶端錯誤—請求有語法錯誤或者請求無法實現(xiàn);
- 5XX 服務(wù)器端錯誤—服務(wù)器未能實現(xiàn)合法的請求;
2、響應(yīng)頭
響應(yīng)頭同樣可用于傳遞一些附加信息
常見的響應(yīng) Header
| 方法名 | 功能 |
|---|---|
| Date | 服務(wù)器的日期 |
| Last-Modified | 該資源最后被修改的時間 |
| Transfer-Encoding | 取值一般為 chunked,出現(xiàn)在 Content-Length 不能確定的情況下,表示服務(wù)器不知道響應(yīng)板體的數(shù)據(jù)大小,一般同時出現(xiàn)Content-Encoding響應(yīng)頭 |
| Set-Cookie | 設(shè)置 Cookie |
| Location | 重定向到另一個 URL,如輸入瀏覽器就輸入 baidu.com 回車,會自動跳轉(zhuǎn)到https://www.baidu.com 就是通過這個響應(yīng)頭控制的 |
| Server | 后臺服務(wù)器 |
3、響應(yīng)體
響應(yīng)體也就是網(wǎng)頁的正文內(nèi)容,一般在響應(yīng)頭中會用 Content-Length 來明確響應(yīng)體的長度,便于瀏覽器接收,對于大數(shù)據(jù)量的正文信息,也會使用 chunked 的編碼方式
http 協(xié)議種類 和協(xié)議所屬層
