HTTP 報文內容
首先通過思維導圖大致瞭解以下 HTTP 報文內容
HTTP請求報文格式如下:
1.1 請求行
請求行由三部分組成:請求方法,請求URL(不包括域名),HTTP協議版本
請求方法比較多:GET
、POST
、HEAD
、PUT
、DELETE
、OPTOINS
、TRACE
、CONNECT
最常用的是GET
和POST
1.1.1 請求方法
- 1、GET
請求獲取Request-URI(URI:統一資源識別符號,URL:統一資源定位符,是其子集,URI注重的是標識,而URL強調的是位置,可以看成原始的URI)所標識的資源。
傳遞引數長度受限制,因此傳遞的引數是直接表示在位址列中,而特定的瀏覽器和伺服器對 url 的長度是有限制的。
因此,GET 不適合用來傳遞私密資料,也不適合傳遞大量資料。
一般的HTTP請求大多都是GET。
- 2、POST
在Request-URI所標識的資源後附加新的資料,POST 把傳遞的資料封裝在 HTTP 請求資料中,以名稱/值的形式出現,可以傳輸大量資料,對資料沒有限制,也不會顯示在 URL 中。
表單提交用的是 POST。
- 3、HEAD
HEAD 跟 GET 相似,不過服務端接收到 HEAD 請求時只返回響應頭,不傳送響應內容。所以,如果是需要檢視某個頁面的狀態時,用 HEAD 更高效,因為省去了傳輸頁面內容的時間。
- 4、DELETE
刪除某一個資源,請求刪除URL指向的資源
- 5、OPTIONS
請求查詢伺服器的效能,或者查詢與資源相關的選項,用於獲取當前URL所支援的方法,若請求成功,會在HTTP頭中包含一個名為"Allow"的頭,值是所支援的方法,如"GET,POST"
- 6、PUT
把一個資源放在指定的位置上。
本質上來講,PUT和POST極為相似,都是向伺服器傳送資料,但它們之間有一個重要的區別,PUT通常制定了資源的存放位置,而POST則沒有,POST的資料存放位置由伺服器自己決定。
關於POST和PUT的區別以及請求方法的冪等性
- 7、TRACE
跟蹤請求要經過的防火牆、代理或閘道器等,主要用於測試或診斷
- 8、CONNECT
保留將來使用,CONNECT方法是HTTP/1.1協議預留的,能夠將連線改為管道方式的代理伺服器。通常用於SSL加密伺服器的連結與非加密的HTTP代理伺服器的通訊。
1.1.2 HTTP 協議版本
- 1、HTTP/1.0
HTTP/1.0支援:GET、POST、HEAD 三種請求方法。
- 2、HTTP/1.1
HTTP/1.1 是當前正在使用的版本。該版本預設採用持久連線,並能很好的配合代理伺服器工作。還支援以管道的方式同時傳送多個請求,以便降低路線負載,提高傳輸速度。
HTTP/1.1 新增了:OPTIONS、PUT、DELETE、TRACE、CONNECT五種HTTP請求方法
- 3、請求頭部
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: keep-alive
Content-Length: 18
Content-Type: application/json;charset=UTF-8
Host: 127.0.0.1:8080
Origin: http://localhost:1234
Referer: http://localhost:1234/
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36 Edg/85.0.564.44
請求頭部由 關鍵字/值 組成,每行一對
1.User-Agent:產生請求的瀏覽器的型別
2.Accept:客戶端希望瀏覽器接受的資料的型別,如Accept: application/json, text/plain, */* 表示希望接受的是json型別和文字型別,*/* 表示接受所有型別。
3.Content-Type:傳送端傳送的實體資料的型別,比如Content-Type: application/json;charset=UTF-8,說就json格式的資料。
4.Host:請求的主機名,允許多個域名同處於一個IP地址,即虛擬主機
- Content-Type
常見的Content-Type:
Content-Type | 解釋 |
---|---|
text/html | html格式 |
text/plain | 純文字格式 |
text/css | CSS格式 |
text/javascript | js格式 |
image/gif | gif圖片格式 |
image/jpeg | jpg圖片格式 |
image/png | png圖片格式 |
application/x-www-form-urlencoded | POST專用:普通的表單提交預設是通過這種方式。form表單資料被編碼為key/value格式傳送到伺服器。 |
application/json | POST專用:用來告訴服務端訊息主體是序列化後的 JSON 字串 |
text/xml | POST專用:傳送xml資料 |
multipart/form-data | POST專用:下面講解 |
- 空行
請求頭之後是一個空行,通知伺服器以下不再有請求頭
- 請求體
GET沒有請求資料,POST有。
與請求資料相關的最常使用的請求頭是 Content-Type 和 Content-Length 。
響應報文
HTTP響應報文和請求報文的結構差不多,也是由四個部分組成:
<status-line> //狀態行
<headers> //訊息報頭
<blank line> //空行
<response-body> //響應體
- 狀態行
狀態行也由三部分組成:伺服器HTTP協議版本,響應狀態碼,狀態碼的文字描述
格式:HTTP-Version Status-Code Reason-Phrase CRLF
比如:HTTP/1.1 200 OK
狀態碼:由3位數字組成,第一個數字定義了響應的類別
1xx:指示資訊,表示請求已接收,繼續處理
2xx:成功,表示請求已被成功接受,處理。
200 OK:客戶端請求成功
204 No Content:無內容。伺服器成功處理,但未返回內容。一般用在只是客戶端向伺服器傳送資訊,而伺服器不用向客戶端返回什麼資訊的情況。不會重新整理頁面。
206 Partial Content:伺服器已經完成了部分GET請求(客戶端進行了範圍請求)。響應報文中包含Content-Range指定範圍的實體內容
3xx:重定向
301 Moved Permanently:永久重定向,表示請求的資源已經永久的搬到了其他位置。
302 Found:臨時重定向,表示請求的資源臨時搬到了其他位置
303 See Other:臨時重定向,應使用GET定向獲取請求資源。303功能與302一樣,區別只是303明確客戶端應該使用GET訪問
307 Temporary Redirect:臨時重定向,和302有著相同含義。POST不會變成GET
304 Not Modified:表示客戶端傳送附帶條件的請求(GET方法請求報文中的IF…)時,條件不滿足。返回304時,不包含任何響應主體。雖然304被劃分在3XX,但和重定向一毛錢關係都沒有
一個304的使用場景:
快取伺服器向伺服器請求某一個資源的時候,伺服器返回的響應報文具有這樣的欄位:Last-Modified:Wed,7 Sep 2011 09:23:24,快取器會儲存這個資源的同時,儲存它的最後修改時間。下次使用者向快取器請求這個資源的時候,快取器需要確定這個資源是新的,那麼它會向原始伺服器傳送一個HTTP請求(GET方法),並在請求頭部中包含了一個欄位:If-Modified-Since:Wed,7 Sep 2011 09:23:24,這個值就是上次伺服器傳送的響應報文中的最後修改時間。
假設這個資源沒有被修改,那麼伺服器返回一個響應報文:
HTTP/1.1 304 Not Modified
Date:Sat, 15 Oct 2011 15:39:29
(空行)
(空響應體)
用304告訴快取器資源沒有被修改,並且響應體是空的,不會浪費頻寬。
4xx:客戶端錯誤
- 400 Bad Request:客戶端請求有語法錯誤,伺服器無法理解。
- 401 Unauthorized:請求未經授權,這個狀態程式碼必須和WWW-Authenticate報頭域一起使用。
- 403 Forbidden:伺服器收到請求,但是拒絕提供服務
- 404 Not Found:請求資源不存在。比如,輸入了錯誤的url
- 415 Unsupported media type:不支援的媒體型別
5xx:伺服器端錯誤,伺服器未能實現合法的請求。
- 500 Internal Server Error:伺服器發生不可預期的錯誤。
- 503 Server Unavailable:伺服器當前不能處理客戶端的請求,一段時間後可能恢復正常,
本作品採用《CC 協議》,轉載必須註明作者和本文連結