語言作為工具,對於我們之重要,正如駿馬對騎士的重要,最好的駿馬適合於最好的騎士,最好的語言適合於最好的思想。—— 但丁自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持久連線、管道機制、分塊傳輸編碼、
新增了許多動詞方法:put
、patch
、head
、
options
、delete
、請求的頭資訊新增了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...