重新學習web後端開發 003 了解http請求

2021-09-24 07:45:43 字數 4278 閱讀 4020

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

自2023年發布第乙個http版本v0.9標準以來,經過了多年的發展,最新的http版本v2已於2023年發布,同時下一代版本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

在上篇文章中,我們向"/hello"發起了乙個http請求,下面具體分析一下。

《上面一行是乙個空行crlf, 同時請忽略本行的說明文字》

複製**其中,第1行是請求行,第2-10行都是請求頭,第11行是乙個空行,沒有body訊息。

乙個http請求包括三個部分:

請求行請求頭

訊息體(body)[可選]

複製**包括三個部分:

請求方法,這裡是get

訪問資源url,這裡是/hello

http版本,這裡是1.1

上面的請求行,簡單理解就是:採用http 1.1協議,向/hello傳送乙個get請求,希望獲取到該url對應的資源。

這裡,我們要重點了解下請求方法。有過開發經驗,尤其是restful api介面開發經驗的朋友,應該比較了解常用的請求方法。比如:get、post、put、delete等。

上述四種方法,是在做後端開發中會經常用到的。我們常說的「crud-增刪改查」,就可以簡單一一對應到相應的方法上。

tip:該方法可在實踐中用於「服務探活」或者用於心跳機制中的」心跳包「。

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

yesyes

yesyes

post

rfc 7231

yesyes

nono

yesput

rfc 7231

yesyes

noyes

nodelete

rfc 7231

noyes

noyes

nohead

rfc 7231

nono

yesyes

yesoptions

rfc 7231

optional

yesyes

yesno

connect

rfc 7231

yesyes

nono

nopatch

rfc 5789

yesyes

nono

notrace

rfc 7231

noyes

yesyes

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客戶端名稱

服務端可根據此欄位了解客戶端的型別。常用於訪問統計。

accept

可接受的響應內容**格式

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:

該get請求中,訊息體部分為空。後續出現具有body部分的請求時,我們會具體分析。

重新學習web後端開發 003 了解http請求

語言作為工具,對於我們之重要,正如駿馬對騎士的重要,最好的駿馬適合於最好的騎士,最好的語言適合於最好的思想。但丁自1991年發布第乙個http版本v0.9標準以來,經過了多年的發展,最新的http版本v2已於2015年發布,同時下一代版本http v3也在制定中。然而,當前使用最為廣泛的是1.1版本...

重新學習makefile

今天回顧了一下makefile,做下筆記 首先準備幾個簡單的檔案 add.c head.h main.c mul.c sub.c 然後第一版 makefile 然後第二版 gcc c main.c o main.o 然後第三版 makefile 的語法跟shell 很像 第四版 目標 依賴 tab ...

重新學習struts

這就是所謂的一邊工作一邊學習。今天準備把給公司寫個管理頁面,按照之前的路數,寫起來應該挺快,但是不太規範。也就沉下心來學習一下了。第二個學習的是,異常處理。也是在學校的時候,聽老師說過,struts2有提供乙個異常處理機制。平常我們有些異常處理,會在 中寫try catch。public strin...