重新學習web後端開發-003-瞭解http請求
語言作為工具,對於我們之重要,正如駿馬對騎士的重要,最好的駿馬適合於最好的騎士,最好的語言適合於最好的思想。—— 但丁
1. http協議發展
自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為準。
2. http請求
在上篇文章中,我們向"/hello"發起了一個http請求,下面具體分析一下。
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請求包括三個部分:
- 請求行
- 請求頭
- 訊息體(body)[可選]
2.1 請求行
GET /hello HTTP/1.1
包括三個部分:
- 請求方法,這裡是GET
- 訪問資源url,這裡是/hello
- http版本,這裡是1.1
上面的請求行,簡單理解就是:採用http 1.1協議,向/hello傳送一個GET請求,希望獲取到該url對應的資源。
這裡,我們要重點了解下 請求方法 。有過開發經驗,尤其是restful api介面開發經驗的朋友,應該比較瞭解常用的請求方法。比如:GET、POST、PUT、DELETE等。
- 關於restful api介面的規範和實踐使用,會在後續文章中具體介紹
2.1.1 請求方法(9種)
- GET - 可以理解為查詢行為,獲取指定的資源,一般用來獲取資料。
- POST - 可以理解為新增行為。服務端會根據請求的內容,在伺服器上建立相應的資源。
- PUT - 可以理解為修改行為。服務端會根據請求的內容,如果對應的URI存在,則進行修改。如果不存在,則進行建立。(可選)
- DELETE - 可以理解為刪除行為。服務端會刪除對應的URI資源。
上述四種方法,是在做後端開發中會經常用到的。我們常說的“CRUD-增刪改查”,就可以簡單一一對應到相應的方法上。
- HEAD - 該方法和GET類似,只是伺服器僅返回http狀態行和頭部資訊,不會返回body內容。可以用於只需要獲取相應資源meta資訊,而不需要獲取整個資源內容。
Tip:該方法可在實踐中用於“服務探活”或者用於心跳機制中的”心跳包“。
- OPTIONS - 該方法可以返回針對特定URI所支援的http方法。常用於檢查web服務針對特定資源所提供的功能。後續我們還會提到它,用於 解決前端跨域 問題。
- CONNECT - 該方法用於將請求轉換為透明的tcp/ip隧道。常用於HTTPS。
- PATCH - 該方法可用於更新特定資源的部分內容。相對很少使用。
- TRACE - 該方法使伺服器原樣返回任意客戶端請求的任何內容。主要用於協議除錯。存在安全問題,建議服務端關閉,不要使用。
2.1.1.1 方法特性 - 安全性
某些方法在設計時就被定義為"安全方法"。所謂的安全方法是指用於檢索資料,不會改變服務資源的狀態。專業點的說法就是不會產生”副作用“(side effects)。比如:get方法不會改變資源的內容,是安全的,而delete方法會刪除特定的資源,是不安全的。
2.1.1.2 方法特性 - 冪等性
某些方法在設計時就被定義為冪等的。所謂冪等是指相同的請求,無論呼叫多少次,都會產生一樣的作用。比如:DELETE。對於任一個DELETE請求,無論執行多少次,其產生的作用是一樣的。也就是說刪除某個特定資源一次,和刪除多次,其對資源的作用是一樣的。
Tip:要注意區分安全性和冪等性的區別。安全性是強調不會產生副作用,而冪等性強調的是多次請求所產生的作用是一樣的。
2.1.1.3 方法小結
來自維基百科的表格,略作調整
方法名 | 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也是。
2.1.2 訪問資源
/hello,為該GET請求的資源地址。和頭部區域中的HOST部分一起確定唯一的資源地址。
2.1.3 協議版本號
HTTP/1.1 - 表明使用的http協議版本是1.1
2.2 請求頭
請求頭位於請求行之後,使用key-value的格式,並以CRLF結尾。也就是說每行都是一個鍵值對。請求頭可以包括多個鍵值對。最後使用一個空行,來表明整個請求頭的結束。
標準請求頭欄位有36個,非標準的有十多個。作為後端開發人員,需要了解一些常見的請求頭。我們首先介紹下'hello,world'中的請求頭,後續出現其它的請求頭欄位時再一一說明。
注意:請求頭欄位名是大小寫不敏感的,而方法名都是大寫的,是大小寫敏感的。
2.2.1 "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,詳見後續文章。
2.3 訊息體-body部分
該GET請求中,訊息體部分為空。後續出現具有body部分的請求時,我們會具體分析。
3. 小結
本節我們主要介紹了http協議請求部分的基本內容。當然這只是http協議的一部分,也是作為web後端開發人員需要掌握的基本知識。在後面的文章中,會逐漸展開http協議的相關內容。希望通過具體專案開發實踐和所使用的技術背後的知識相結合,能夠給大家帶來幫助。下一節,我們將分析http響應相關的內容。
本文為作者原創作品,屬於《重新學習web後端開發》專輯中的一篇,轉載時請備註作者資訊及來源。本文原文地址: https://www.donnyzhang.com/20...