乙個普通的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-encoding
和content-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頭域,用...