語言做爲工具,對於咱們之重要,正如駿馬對騎士的重要,最好的駿馬適合於最好的騎士,最好的語言適合於最好的思想。—— 但丁html
自1991年發佈第一個HTTP版本V0.9標準以來,通過了多年的發展,最新的HTTP版本V2已於2015年發佈,同時下一代版本HTTP V3也在制定中。然而,當前使用最爲普遍的是1.1版本,同時正在往2.0版本過渡,後續文章中將會介紹HTTP/2的狀況,相較以前的版本,2.0版本有很是大的變化。前端
發佈時間 | 版本 | 特色 | 相關文檔 |
---|---|---|---|
1991 | 0.9 | 該版本極其簡單,只有一個命令GET |
|
1996 | 1.0 | 支持任何格式的內容,協議格式變化。新增功能還包括 狀態碼(status code)、多字符集支持、 多部分發送(multi-part type)、權限(authorization)、 緩存(cache)、內容編碼(content encoding)等。 |
|
1997 | 1.1 | 持久鏈接、管道機制、分塊傳輸編碼、 新增了許多動詞方法: PUT 、PATCH 、HEAD 、 OPTIONS 、DELETE 、請求的頭信息新增了Host 字段 |
RFC 7230 ~ 7235 |
2015 | 2.0 | 二進制協議、多工、數據流、頭信息壓縮、服務器推送 | RFC 7540 |
提示:後續如無特殊說明,都以http v1.1爲準。web
在上篇文章中,咱們向"/hello"發起了一個http請求,下面具體分析一下。apache
GET /hello HTTP/1.1
Host: localhost:9800
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
<上面一行是一個空行CRLF, 同時請忽略本行的說明文字> 複製代碼
其中,第1行是請求行,第2-10行都是請求頭,第11行是一個空行,沒有body消息。後端
一個http請求包括三個部分:api
GET /hello HTTP/1.1
複製代碼
包括三個部分:跨域
上面的請求行,簡單理解就是:採用http 1.1協議,向/hello發送一個GET請求,但願獲取到該url對應的資源。緩存
這裏,咱們要重點了解下請求方法。有過開發經驗,尤爲是restful api接口開發經驗的朋友,應該比較瞭解經常使用的請求方法。好比:GET、POST、PUT、DELETE等。安全
- 關於restful api接口的規範和實踐使用,會在後續文章中具體介紹
上述四種方法,是在作後端開發中會常常用到的。咱們常說的「CRUD-增刪改查」,就能夠簡單一一對應到相應的方法上。服務器
Tip:該方法可在實踐中用於「服務探活」或者用於心跳機制中的」心跳包「。
某些方法在設計時就被定義爲"安全方法"。所謂的安全方法是指用於檢索數據,不會改變服務資源的狀態。專業點的說法就是不會產生」反作用「(side effects)。好比:get方法不會改變資源的內容,是安全的,而delete方法會刪除特定的資源,是不安全的。
某些方法在設計時就被定義爲冪等的。所謂冪等是指相同的請求,不管調用多少次,都會產生同樣的做用。好比:DELETE。對於任一個DELETE請求,不管執行多少次,其產生的做用是同樣的。也就是說刪除某個特定資源一次,和刪除屢次,其對資源的做用是同樣的。
Tip:要注意區分安全性和冪等性的區別。安全性是強調不會產生反作用,而冪等性強調的是屢次請求所產生的做用是同樣的。
來自維基百科的表格,略做調整
方法名 | RFC文檔 | Request has Body | Response has Body | 安全 | 冪等 | 可緩存 |
---|---|---|---|---|---|---|
GET | RFC 7231 | Optional | Yes | Yes | Yes | Yes |
POST | RFC 7231 | Yes | Yes | No | No | Yes |
PUT | RFC 7231 | Yes | Yes | No | Yes | No |
DELETE | RFC 7231 | No | Yes | No | Yes | No |
HEAD | RFC 7231 | No | No | Yes | Yes | Yes |
OPTIONS | RFC 7231 | Optional | Yes | Yes | Yes | No |
CONNECT | RFC 7231 | Yes | Yes | No | No | No |
PATCH | RFC 5789 | Yes | Yes | No | No | No |
TRACE | RFC 7231 | No | Yes | Yes | Yes | No |
注意:POST方法不是冪等的。在接口開發時,要處理可能會出現的冪等問題。關於接口冪等問題的處理,能夠參考後續的文章。PUT和DELETE方法是冪等的,GET也是。
/hello,爲該GET請求的資源地址。和頭部區域中的HOST部分一塊兒肯定惟一的資源地址。
HTTP/1.1 - 代表使用的http協議版本是1.1
請求頭位於請求行以後,使用key-value的格式,並以CRLF結尾。也就是說每行都是一個鍵值對。請求頭能夠包括多個鍵值對。最後使用一個空行,來代表整個請求頭的結束。
標準請求頭字段有36個,非標準的有十多個。做爲後端開發人員,須要瞭解一些常見的請求頭。咱們首先介紹下'hello,world'中的請求頭,後續出現其它的請求頭字段時再一一說明。
注意:請求頭字段名是大小寫不敏感的,而方法名都是大寫的,是大小寫敏感的。
字段 | 描述 | 例子 | 備註 |
---|---|---|---|
Host | 主機地址,包括域名和端口號。(用於支持虛擬主機) | Host: localhost:9800 | HTTP/1.1是強制必需要有的。HTTP/2 將不使用該字段。 |
Connection | 當前鏈接控制選項 | Connection: keep-alive | HTTP/1.1默認是keep-alive。HTTP/2 將不使用該字段。 |
User-Agent | http客戶端名稱 | User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 |
服務端可根據此字段瞭解客戶端的類型。經常使用於訪問統計。 |
Accept | 可接受的響應內容媒體格式 | text/html,application/xhtml+xml,application/xml; q=0.9,image/webp,image/apng,/;q=0.8 |
|
Accept-Language | 可接受的語言 | Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7 | |
Accept-Encoding | 可接受的數據壓縮編碼格式 | Accept-Encoding: gzip, deflate, br | 可用於提高數據傳輸性能 |
Pragma | 特殊指令,經常使用於進行緩存控制 | Pragma: no-cache | 支持HTTP/1.0,HTTP/1.1 |
Cache-Control | 緩存控制指令 | Cache-Control: no-cache | 支持HTTP/1.1 |
Upgrade-Insecure-Requests | 告訴服務端,建議從http升級到https。經常使用於過分階段。 | Upgrade-Insecure-Requests: 1 | 非標準字段 |
Tip:
- 關於Connection的keep-alive,詳見後續文章。
該GET請求中,消息體部分爲空。後續出現具備body部分的請求時,咱們會具體分析。
本節咱們主要介紹了http協議請求部分的基本內容。固然這只是http協議的一部分,也是做爲web後端開發人員須要掌握的基本知識。在後面的文章中,會逐漸展開http協議的相關內容。但願經過具體項目開發實踐和所使用的技術背後的知識相結合,可以給你們帶來幫助。下一節,咱們將分析http響應相關的內容。