從新學習web後端開發-003-瞭解http請求

black-and-white-blackboard-business-356043 (1).jpg

語言做爲工具,對於咱們之重要,正如駿馬對騎士的重要,最好的駿馬適合於最好的騎士,最好的語言適合於最好的思想。—— 但丁html

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 持久鏈接、管道機制、分塊傳輸編碼、
新增了許多動詞方法:PUTPATCHHEAD
OPTIONSDELETE 、請求的頭信息新增了Host字段
RFC 7230 ~ 7235
2015 2.0 二進制協議、多工、數據流、頭信息壓縮、服務器推送 RFC 7540

提示:後續如無特殊說明,都以http v1.1爲準。web

2. http請求

在上篇文章中,咱們向"/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

  1. 請求行
  2. 請求頭
  3. 消息體(body)[可選]

2.1 請求行

GET /hello HTTP/1.1
複製代碼

包括三個部分:跨域

  1. 請求方法,這裏是GET
  2. 訪問資源url,這裏是/hello
  3. 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響應相關的內容。

相關文章
相關標籤/搜索