Http協(xié)議你都了解嗎?
1. HTTP協(xié)議
超文本傳輸協(xié)議(HyperText Transfer Protocol),縮寫HTTP。
通過 HTTP 或者 HTTPS 協(xié)議請求的資源由統(tǒng)一資源標(biāo)識符(Uniform Resource Identifiers,URI)來標(biāo)識。由 HTTP 客戶端發(fā)起一個(gè)請求,創(chuàng)建一個(gè)到服務(wù)器指定端口(默認(rèn)是80端口)的 TCP連接。HTTP 服務(wù)器則在那個(gè)端口監(jiān)聽客戶端的請求。一旦收到請求,服務(wù)器會(huì)向客戶端返回一個(gè)狀態(tài),比如" HTTP/1.1 200 OK ",以及返回的內(nèi)容,如請求的文件、錯(cuò)誤消息、或者其它信息。
2. URI 和 URL
▐ 2.1 URI
Uniform Resource Identifier,統(tǒng)一資源標(biāo)識符Web上可用的每種資源如HTML 文檔、圖像、視頻片段、程序等都是用URI來定位的;
URI 一般由三部分組成:
- 訪問資源的命名機(jī)制
- 存放資源的主機(jī)名
- 資源自身的名稱,由路徑表示,著重強(qiáng)調(diào)于資源
▐ 2.2 URL
Uniform Resource Location,統(tǒng)一資源定位符
URL 是 Internet 上用來描述信息資源的字符串,主要用在各種 WWW 客戶程序和服務(wù)器程序上。URL 是 URI 的一種。
采用 URL 可以用一種統(tǒng)一的格式來描述各種信息資源,包括文件、服務(wù)器的地址和目錄等。
URL 一般由三部組成
- 協(xié)議
- 可訪問該資源的主機(jī)IP地址(或帶有端口號)
- 主機(jī)資源的具體地址(目錄加文件名)
▐ 2.3 URL 的構(gòu)成
- 協(xié)議部分:協(xié)議部分為 http:
- 域名部分:域名部分例如"www.jianshu.com",當(dāng)然域名也可以用 IP 地址,IP 少 一步用DNS服務(wù)器解析
- 端口部分:域名和端口之間使用":"分隔。
- 端口不是URL必須的部分,如果端口省略,將采用默認(rèn)端口號80,所以實(shí)際請求地址是http://www.jianshu.com:80
- 虛擬目錄部分:從域名后的第一個(gè)“/”開始到最后一個(gè)“/”為止,是虛擬目錄部分。虛擬目錄也不是一個(gè)URL必須的部分。
- 文件名部分:指在服務(wù)器中訪問的資源文件的路徑。
- 錨部分:從“#”開始到最后,都是錨部分,也不是必須的部分。
- 做過 html 的都知道,用于定位到頁面的滑動(dòng)位置。
- 參數(shù)部分:從“?”開始到“#”為止之間的部分為參數(shù)部分,又稱搜索部分、查詢部分。例如?page=1。
3. 請求的種類
HTTP 協(xié)議中共定義了八種方法或者叫“動(dòng)作”來表明對 Request-URI 指定的資源的不同操作方式。就類似操作數(shù)據(jù)庫和文件系統(tǒng)一樣,設(shè)計(jì)網(wǎng)絡(luò)的請求也是一樣。URL 用于定位了網(wǎng)絡(luò)資源,創(chuàng)造 PUT,DELETE,POST,GET 來對應(yīng)增,刪,改,查操作。但是我們在實(shí)際應(yīng)用中常用的也就是 get 和 post,其他請求方式也都可以通過這兩種方式間接的來實(shí)現(xiàn)。
GET
向指定資源發(fā)出“顯示“信息。使用GET方法只用于獲取數(shù)據(jù),而不應(yīng)該改變數(shù)據(jù)本身,即不對數(shù)據(jù)進(jìn)行操作和提交信息。
POST
向指定資源提交數(shù)據(jù),請求服務(wù)器進(jìn)行處理(例如提交參數(shù)/表單,或者上傳文件)??赡軙?huì)對數(shù)據(jù)進(jìn)行操作和提交信心,創(chuàng)建資源。
PUT
向指定資源位置上傳其最新內(nèi)容。
DELETE
顧名思義,請求服務(wù)器刪除 URI 所對應(yīng)的資源。
HEAD
與 GET 方法一樣,都是向服務(wù)器發(fā)出指定資源的請求。只不過服務(wù)器將不傳回資源的本文部分。它的好處在于,使用這個(gè)方法可以在不必傳輸全部內(nèi)容的情況下,就可以獲取其中“關(guān)于該資源的信息”(元信息或稱元數(shù)據(jù))。
TRACE
回顯服務(wù)器收到的請求,主要用于測試或診斷。
OPTIONS
這個(gè)方法可使服務(wù)器傳回該資源所支持的所有 HTTP 請求方法。用'*'來代替資源名稱,向 Web 服務(wù)器發(fā)送 OPTIONS 請求,可以測試服務(wù)器功能是否正常運(yùn)作。
CONNECT
HTTP/1.1 協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。通常用于 SSL 加密服務(wù)器的鏈接(經(jīng)由非加密的 HTTP 代理服務(wù)器)。
4. GET 和 POST 的區(qū)別
1.參數(shù)攜帶位置不同。
GET 提交的數(shù)據(jù)會(huì)附加家 URL 之后(即把數(shù)據(jù)放在請求行中),會(huì)在地址欄中顯示,接?=傳值,多個(gè)參數(shù)用&連接。POST 提交的數(shù)據(jù)放在 HTTP 包體中,地址欄不顯示。
2.傳輸數(shù)據(jù)大小限制不同。
不同瀏覽器對 URL 的長度有限制,因此對于 GET 提交時(shí),傳輸數(shù)據(jù)就會(huì)受到URL 長度的限制。POST 由于不是通過 URL 傳值,理論上數(shù)據(jù)不受限。
3.POST 的安全性要比 GET 的安全性高。因?yàn)闉g覽器可能對請求地址做歷史記錄的存儲(chǔ),對于 GET 請求的登錄,那其他人就可以直接在 URL 上拿到你的賬號和密碼了,而 POST 拿不到參數(shù)。
5. HTTP 請求信息
客戶端發(fā)送一個(gè) HTTP 請求到服務(wù)的請求信息包括以下格式:
請求行(request line)、請求頭(header,常用于存放 token)、空行和請求數(shù)據(jù)四個(gè)部分。
例如:
- GET /8669504-c2641e8e6eed5904.png HTTP/1.1
- Host www.jianshu.com
- User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
- Accept image/webp,image/,/*;q=0.8
- Referer www.jianshu.com
- Accept-Encoding gzip, deflate, sdch
- Accept-Language zh-CN,zh;q=0.8
- name=Professional%20Ajax&publisher=lili
- 第一行請求行,用來說明請求類型,要訪問的資源以及所使用的HTTP版本。
- 第二部分,大括號之間的請求頭部,用于提交服務(wù)器的附加信息。
- 第三部分,空行,請求頭部后面的空行是必須的。
- 第四部分,請求數(shù)據(jù)也叫主體,可以添加任意的其他數(shù)據(jù)。
6. HTTP 響應(yīng)信息
服務(wù)器接受請求回傳響應(yīng)信息也由四分部組成:
狀態(tài)行,消息報(bào)頭,空行和響應(yīng)正文。
例如:
- 第一行包括協(xié)議版本號,返回狀態(tài)碼
- 第二行為響應(yīng)日期時(shí)間
- 第三行為響應(yīng)消息報(bào)頭,Content-Type: 指定了 MIME 類型的 HTML(text/html),編碼類型是 UTF-8
- 響應(yīng)正文,服務(wù)器返回給客戶端的文本信息。
7. HTTP 狀態(tài)碼
狀態(tài)碼有三位數(shù)字,第一數(shù)字表示當(dāng)前相應(yīng)的類型,各個(gè)類型有:
- 1xx消息——請求已被服務(wù)器接受,繼續(xù)處理
- 2xx成功——請求已成功被服務(wù)器接收(如見到就像親人的200,201)
- 3xx重定向——需要后續(xù)操作才能完成這一請求
- 4xx請求錯(cuò)誤——客戶端錯(cuò)誤:請求含有詞法錯(cuò)誤或無法被執(zhí)行(如見到就想暴走的404 Not Found)
- 5xx服務(wù)器錯(cuò)誤——服務(wù)端錯(cuò)誤:服務(wù)器在處理某個(gè)正確請求時(shí)發(fā)生錯(cuò)誤(如一見到就想找后臺(tái)的500)
常見的狀態(tài)碼如下:
- 200 OK:客戶端請求成功
- 400 Bad Request:客戶端請求有語法錯(cuò)誤,不能被服務(wù)器所理解
- 401 Unauthorized:請求未經(jīng)授權(quán),這個(gè)狀態(tài)代碼必須和 WWW-Authenticate 報(bào)頭域一起使用
- 403 Forbidden:服務(wù)器收到請求,但是拒絕提供服務(wù)
- 500 Internal Server Error:服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤
- 503 Server Unavailable:服務(wù)器當(dāng)前不能處理客戶端的請求,一段時(shí)間后可能恢復(fù)正常
8. 總結(jié)HTTP一次請求的完整過程
- 客戶端與服務(wù)端建立 TCP 連接
- 通過 TCP 套接字連接,發(fā)送 HTTP 請求
- 服務(wù)器解析請求,定位請求資源,將查詢資源然后返回 HTML 文本數(shù)據(jù),由客戶端讀取。
- 釋放 TCP 連接
- 客戶端瀏覽器解析 HTML 內(nèi)容
瀏覽器輸入網(wǎng)站發(fā)生的事件:
- 瀏覽器向 DNS 服務(wù)器請求解析該 URL 中的域名所對應(yīng)的 IP 地址;
- 解析出 IP 地址后,根據(jù)該 IP 地址和默認(rèn)端口 80,和服務(wù)器建立 TCP 連接;
- 瀏覽器發(fā)出讀取文件(URL 中域名后面部分對應(yīng)的文件)的 HTTP 請求,該請求報(bào)文作為 TCP 三次握手的第三個(gè)報(bào)文的數(shù)據(jù)發(fā)送給服務(wù)器;
- 服務(wù)器對瀏覽器請求作出響應(yīng),并把對應(yīng)的 html 文本發(fā)送給瀏覽器;
- 釋放 TCP 連接;
- 瀏覽器將該 html 文本并顯示內(nèi)容;
以上是 Http 的全部總結(jié),該篇文章不斷完善不斷更新。