HTTP 常用知識點

2021-10-06 11:22:38 字數 3142 閱讀 9352

乙個普通的http請求報文格式如下:

[請求方法] [uri] [http版本]

host: [主機位址]

// ... 其它請求頭資訊

// 一行空行

[請求實體]

簡單例子如下:

上述例子有兩個空行,但並非無意義。第一行空行為分割請求頭和請求實體的標誌,第二行是因為請求實體內容為空(如果有內容就不是空行)。

下面來看響應報文格式:

[http協議版本] [響應狀態碼] [狀態碼含義]

content-type: [響應內容型別]

// ... 其它響應頭資訊

// 一行空行

[響應實體]

簡單例子如下:

content-length表示請求/響應實體內容的長度(單位是位元組)。

當 content-length 的值與實際內容位元組數不符會出現什麼情況?

當內容的實際位元組數大於content-length的值時:

當內容的實際位元組數小於content-length的值時:

注意:在多數瀏覽器中發起 ajax 請求時是不能自定義content-length頭的(出於安全原因),以 chorme 為例會報refused to set unsafe header "content-length"的錯誤。

關於 php 的應用技巧:

一般來說瀏覽器在接收到content-length單位個位元組後就會視為本次請求完畢,所以利用content-length可以實現在請求完畢後繼續執行一些任務最後才結束我們的 php 程序。示例如下:

訪問上述**,可以發現輸出i love http!後請求就完成,但是 php 的程序仍在執行,直到 6 秒後寫入檔案1.txt程序結束。

這種方式適用於能夠計算響應內容長度的情況,但如果響應長度不確定,比如我們要返回乙個很大的響應,因為要節省記憶體所以採用分段讀入,處理,輸出的策略,那麼這種情況就不能用這個方法了,因為無法提前計算出內容的長度。不過如果你使用了php-fpm可以使用 fastcgi_finish_request 函式實現這個功能。

transfer-encoding表示傳輸的編碼,一般情況下值都是chunked,表示分塊傳輸。使用chunked分塊傳輸解決的就是content-length無法提前計算出來的情況,所以transfer-encodingcontent-length是互斥的,如果同時出現,瀏覽器以transfer-encoding為準。使用chunked後響應的示例如下:

content-type表示響應實體的 **型別。

accept表示客戶端能接受響應實體的 **型別。

方法get

post

putdelete

patch

options

head

請求實體有內容否是

是否是否

否請求成功時響應實體有內容是是

否否否是

否安全是否

否否否是

是冪等是否

是是否是

是可快取是否

否否否否

是允許出現在 html 表單是是

否否否否

否列出一些常用的狀態碼:

200 201 202 204

301 302 304

400 401 403 404 405 422

502 503 504

301 和 302 的區別?

301 重定向作為永久重定向,也意味著它是可以被快取的,舉個例子:使用者第一次訪問 a.com,伺服器響應 301 並重定向至 b.com,重定向的結果會預設被瀏覽器快取下來,當使用者再次訪問 a.com 時,瀏覽器並不會向 a.com 發起請求,而是直接跳轉到 b.com。而 302 重定向則預設不會被瀏覽器快取下來,意味著每次都會請求原伺服器,再按伺服器返回的響應執行重定向操作。當然通過設定快取控制頭可以改變預設的快取策略。

301 和 302 導致 post 請求變 get(post 請求引數丟失)?

當使用post方法請求時如果服務端返回 301 或 302 狀態碼並指定重定向位址,那麼大多數瀏覽器會採用get方法請求重定向位址,這意味著之前post請求所帶的引數會丟失!如果你不希望請求的方法被改變,則服務端應該返回 307(對應 302)或 308(對應 301)。

詳見:

Http協議相關常用知識點

什麼是http協議,預設埠多少 http協議 超文字傳輸協議 預設埠 80 什麼是https協議,預設埠多少?https http ssl 安全套階層協議 預設埠 443 http請求訊息包括那3部分組成?請求訊息 請求行 請求方法 get post 請求的位址 請求的http協議版本 請求頭 請求...

Http協議知識點

1.型別 http伺服器會給在http中傳送的http資源物件附加乙個mime型別,接收http資源物件的客戶端會根據這個型別來判斷是否能夠進行處理,例如瀏覽器就能夠處理上百種mime型別的http資源物件 2.mime型別是一種文字標記,表示一種主要物件型別和一種特定的子型別,中間用一條斜槓來分隔...

HTTP知識點 (三)

可擴充套件性的乙個重要原則 如果http的某個實現接收到了自身未定義的頭域,將自動忽略它。例如,一台http 1.1的源伺服器從使用http 1.1的proxy那兒接收到一條 的訊息,實際上源伺服器並不知道終端客戶使用的是http 1.0還是http 1.1。因此,http 1.1定義via頭域,用...