本文為《三萬長文50+趣圖帶你領悟web編程的內功心法》第三個章節,
3、HTTP/1.1報文詳解
在RFC2616中心詳細的描述了HTTP/1.1[1]的報文,感興趣的朋友也可以前往閱讀,
HTTP是基于TCP的,HTTP作為應用層協議,會在TCP/IP協議堆疊往下傳遞的時候,不斷封裝資料幀,如下圖:

上面HTTP正文即是以我們HTTP報文格式來組織的,下面我們看看具體的HTTP報文的格式,
3.1、HTTP報文組成部分
HTTP請求和回應都使用如下通用的格式:

-
start-line:起始行,起始行可以為以下兩者之一:-
Request-Line:請求行,如:-
GET /hello-world2.html HTTP/1.1
-
-
Status-Line:狀態行,如:-
HTTP/1.1 200 OK
-
-
-
*(message-header CRLF):0個或者多個訊息頭; -
CRLF:一個空行; -
[message-body]:可選的訊息體;
可以分別把請求報文和回應報文分開來描述:
請求報文

回應報文

可以發現,請求報文和回應報文格式就起始行不一樣,
下面我們逐個來介紹,
為了盡可能保證內容的準確性,下面報文各種欄位說明部分內容,大部分整理自RFC2616和MDN web docs:
- Hypertext Transfer Protocol -- HTTP/1.1 2616[1:1]
- HTTP. MDN web docs[2]
- 《HTTP權威指南》
以上資料內容有沖突的,以RFC2616的為準,
3.2、請求行
請求行格式:
Request-Line = Method SP Request-URI SP HTTP-Version CRLF
3.2.1、Method
方法是區分大訊息的,以下是常用的方法:
| 方法 | 說明 |
|---|---|
| OPTIONS | 列出可以對服務器資源執行哪些方法 |
| GET | 獲取資源 |
| HEAD | 獲取資源的首部,與GET類似,但是不會回應訊息體 |
| POST | 向服務器提交資料 |
| PUT | 將請求主體部分存盤在服務器上 |
| DELETE | 洗掉資源 |
| TRACE | 對可能經過代理服務器傳送到服務器上的報文進行追蹤 |
| CONNECT | 建立連接隧道 |
| extension-method | 擴展方法 |
另外,服務器還可以實作一些自己的請求方法,這些附加的方法是對HTTP規范的擴展,因此也成為擴展方法,
extension-method = token
請求可能的回傳結果:
-
405:表示請求的方法不被允許,這個時候服務器回應頭會回應當前資源允許的方法,如:
-
Allow: GET, HEAD, PUT
-
-
501:代表原服務器的該方法未能被識別或者未實作;
下面逐個方法介紹下:
GET
GET方法意味著可以檢索 Request-URI標識的任何資訊,
如果Request-URI涉及到創建資料,則應該將新建的資料作為回應物體回傳,
如果請求訊息包含 If-Modified-Since,If-Unmodified-Since,If-Match,If-None_match或If-Range標頭欄位,則此時的Get為條件GET,通過使用快取標頭,可以盡可能避免不必要的網路傳輸,
如果請求標頭包含Range,則GET方法變為部分GET,
HEAD
HEAD方法與GET方法很類似,但是HEAD方法在在回應中只回傳首部,不會反悔訊息體,
這就允許客戶端再不用獲取實際資源的情況下,對資源首部進行檢查,如:
- 檢查資源是否有更新:如果獲取到的 Content-Length、Content-MD5、ETag、Last-Modified與之前獲取到的值不同,那么快取應該被視為過期;
- 查看回應狀態碼,查看資源是否存在;
- 獲取首部更多資訊,判斷資源情況,
POST
POST方法起初是用來向服務器傳輸資料的,通常用來提交HTML的表單到服務器,
PUT
PUT方法用于向服務器寫入資源,如果Request-URI對應的資源已經存在的話,就進行更新,
注意:
POST用于向服務器發送資料,PUT用于向服務器上的資源中存盤資料,
DELETE
請求服務器洗掉URL所指示的資源,但是客戶端無法保證洗掉操作一定會被執行,除非在回應式服務器打算洗掉資源或者將其移動到無法訪問的位置,可能的回應:
- 如果回應包含描述狀態的物體,則回應200(確定);
- 如果尚未執行洗掉操作,則回應202(接受);
- 如果已執行該操作,并且回應不包含任何物體,則回應204(無內容),
此方法的回應不可快取,
TRACE
一個請求從客戶端到服務端,中間可能會經歷各種代理、網關等程式,每個中間節點都可能修改原始HTTP請求,為此,通過TRACE,服務端會在接收到請求后反饋一個TRACE回應,并且在回應主體中攜帶它收到的原始請求報文,客戶端拿到TRACE回應,就可以進行測驗和診斷了,其中Via標頭欄位特別有用,它用于充當請求鏈的跟蹤,
可以使用Max-Forwards標頭欄位限制請求鏈的長度,這對于測驗無限回圈中轉發訊息的代理很有用,
如果請求有效,則回應應該在物體正文中包含整個請求訊息,其 Content-Type為"message/http",對此方法的回應絕對不能快取,
TRACE允跨站點跟蹤問題,并且可能使黑客可以選擇竊取您的cookie資訊,基于安全的考慮,一般的服務器會關掉TRACE:
TraceEnable off這樣執行TRACE會導致客戶端收到一個405不允許使用方法的狀態碼,
CONNECT
CONNECT 方法可以開啟一個客戶端與所請求資源之間的雙向溝通的通道,它可以用來創建隧道(tunnel),
例如,CONNECT 可以用來訪問采用了 SSL (HTTPS) 協議的站點,客戶端要求代理服務器將 TCP 連接作為通往目的主機隧道,之后該服務器會代替客戶端與目的主機建立連接,連接建立好之后,代理服務器會面向客戶端發送或接收 TCP 訊息流,[3]
OPTIONS
通過該方法,可以請求服務器獲取Request-URI對應支持的各種通信選項的信息,最常見的如:詢問服務器當前URI支持哪些請求方法,
此方法回應不能快取,
方法的安全性與冪等性
所謂安全性,就是無論方法執行多少次,服務器上的資料都不會被改變,
安全方法:GET、HEAD;
不安全方法:POST、PUT、DELETE操作則會改動資料,
所謂冪等,就是多次執行一個方法,結果都是相同的,
冪等方法:GET、HEAD、PUT、DELETE;
非冪等方法:POST,
3.2.2、Request-URI
URI,Uniform Resource Identifier,請求的統一資源識別符號,
3.2.2.1、URI與URL什么關系?
我們經常會用到這兩個概念,但是他們是什么意思呢?
URI,Uniform Resource Identifier,統一資源識別符號,能夠唯一的標識網上的一個資源,比如,我的網站IT宅的Logo:
https://www.itzhai.com/resources/images/itzhai_logo_home_page.jpg
只要在世界的任何一個有網路的地方,發起請求,就可以拿到這個圖片,這個URI具有唯一性,那什么是URL呢?
URI有兩種形式:URL和URN,
URL
URL,Uniform Resource Locator,統一資源定位符,描述了一臺特定服務器上某個資源的特定位置,例如上面的鏈接就是一個統一資源定位符:

scheme方案:指定方位資源所使用的協議型別,如HTTPS;主機與埠:英特網地址,即域名,這里默認為80埠;路徑:其余部分指定web服務器上的某個資源,
幾乎所有的 URI都是URL,
一個完整的URL格式如下:

用戶名和密碼:有寫服務器要求輸入用戶名和密碼才允許用戶訪問資料,如FTP;?query 查詢字串:可以通過查詢字串進行查詢來縮小所請求資源型別的范圍;fragment片段:指向HTML檔案中特定的圖片或者小節,
URN
URL,Uniform Resource Name,統一資源名,作為特定內容的唯一名稱,與資源所在位置無關,也就是說,我可以給一份檔案定義一個URN,不管你把這個檔案放到哪里,有多少個URL,但是都只有唯一個URN,舉個例子,因特網標準檔案 RFC 3986不管存在哪個服務器上,都可以用唯一的URN來命名:
urn:ietf:rfc:3986
URN處于試驗階段,暫未大范圍使用,
再通俗易懂點來說:URN就相當于身份證,通過特定的規則,制定了一串唯一的字串作為你的身份證,但是沒有規定身份證一定要放在哪里,只是作為你的個人唯一憑證,URL相當于是快遞單上的地址,根據地址,快遞員一定可以把快遞送到唯一的一個目的地,
3.2.3、HTTP-Version
指定了當前請求用到的HTTP協議版本,
3.3、訊息頭[4]
通過傳遞訊息頭(首部),服務器和客戶端可以把自己的資訊或者是請求回應相關資訊進行傳遞,
可以把首部分為:通用首部,請求首部,回應首部,物體首部,擴展首部,下面就來詳細介紹下,
3.3.1、通用首部
有些首部,不管是請求還是回應都會出現他們的身影,我們把他們歸類為通用首部,常見通用首部如下表格所示:
| 首部 | 說明 |
|---|---|
| Cache-Control | 通過指定指令來實作快取機制 |
| Connection | Connection 頭(header) 決定當前的事務完成后,是否會關閉網路連接,如果該值是“keep-alive”,網路連接就是持久的,不會關閉,使得對同一個服務器的請求可以繼續在該連接上完成: Connection: keep-alive Connection: close |
| Data | 提供報文創建的時間 |
| MIME-Version | 提供發送端使用的MIME版本 |
| Trailer | 允許發送方在分塊發送的訊息后面添加額外的元資訊,這些元資訊可能是隨著訊息主體的發送動態生成的,比如訊息的完整性校驗,訊息的數字簽名,或者訊息經過處理之后的最終狀態等, |
| Transfer-Encoding | 告知接收端報文的編碼方式 |
| Upgrade | 允許客戶端指定它支持并且希望使用的通信協議,如果服務器認為適合,則切換協議,服務器必須使用101(交換協議)中的Upgrade標頭欄位回應,以知識正在交換的協議, |
| Via | 顯示報文經過的中間節點,用來追蹤訊息轉發情況,防止回圈請求,以及識別在請求或回應傳遞鏈中訊息發送者對于協議的支持能力 |
| Warning | 包含報文當前狀態可能存在的問題,在回應中可以出現多個 Warning 首部,一般來說, Warning 首部可以應用于任何型別的報文,然而一部分警告碼(warn-code)是為快取代理服務器定制的,并且只可以應用在回應報文中, |
3.3.2、請求首部
客戶端通過傳遞請求頭欄位,將有關請求以及有關客戶端本身的其他資訊傳遞給服務器,這些欄位充當請求修飾符,其語意等同于編程語言方法呼叫中的引數,
常見的請求頭如下:
Accept首部
| 首部 | 說明 |
|---|---|
| Accept | 表明客戶端能夠接受的媒體型別 |
| Accept-Charset | 表明客戶端能夠接受的字符集 |
| Accept-Encoding | 表明客戶端能夠接受的編碼方式 |
| Accept-Language | Section 14.4 |
| TE | 表明客戶端能夠接受的擴展傳輸編碼 |
條件請求首部
| 首部 | 說明 |
|---|---|
| Expect | 指示客戶端要求特定的服務器行為 目前規范中只規定了 "100-continue" 這一個期望條件:通知接收方客戶端要發送一個體積可能很大的訊息體,期望收到狀態碼為100 (Continue) 的臨時回復 |
| If-Match | 請求首部 If-Match 的使用表示這是一個條件請求,在請求方法為 GET 和 HEAD 的情況下,服務器僅在請求的資源滿足此首部列出的 ETag值時才會回傳資源,而對于 PUT 或其他非安全方法來說,只有在滿足條件的情況下才可以將資源上傳, |
| If-Modified-Since | If-Modified-Since 是一個條件式請求首部,服務器只在所請求的資源在給定的日期時間之后對內容進行過修改的情況下才會將資源回傳,狀態碼為 200 ,如果請求的資源從那時起未經修改,那么回傳一個不帶有訊息主體的 304 回應,而在 Last-Modified 首部中會帶有上次修改時間, 不同于 If-Unmodified-Since, If-Modified-Since 只可以用在GET 或 HEAD 請求中, |
| If-None-Match | 對于 GET 和 HEAD 請求方法來說,當且僅當服務器上沒有任何資源的 ETag 屬性值與這個首部中列出的相匹配的時候,服務器端會才回傳所請求的資源,回應碼為 200,對于其他方法來說,當且僅當最終確認沒有已存在的資源的 ETag 屬性值與這個首部中所列出的相匹配的時候,才會對請求進行相應的處理, |
| If-Range | If-Range HTTP 請求頭欄位用來使得 Range 頭欄位在一定條件下起作用:當欄位值中的條件得到滿足時,Range 頭欄位才會起作用,同時服務器回復206 部分內容狀態碼,以及Range 頭欄位請求的相應部分;如果欄位值中的條件沒有得到滿足,服務器將會回傳 200 OK 狀態碼,并回傳完整的請求資源, |
| If-Unmodified-Since | HTTP協議中的 If-Unmodified-Since 訊息頭用于請求之中,使得當前請求成為條件式請求:只有當資源在指定的時間之后沒有進行過修改的情況下,服務器才會回傳請求的資源,或是接受 POST 或其他 non-safe 方法的請求,如果所請求的資源在指定的時間之后發生了修改,那么會回傳 412 (Precondition Failed) 錯誤, |
| Range | The Range 是一個請求首部,告知服務器回傳檔案的哪一部分,在一個 Range 首部中,可以一次性請求多個部分,服務器會以 multipart 檔案的形式將其回傳,如果服務器回傳的是范圍回應,需要使用 206 Partial Content 狀態碼,假如所請求的范圍不合法,那么服務器會回傳 416 Range Not Satisfiable 狀態碼,表示客戶端錯誤,服務器允許忽略 Range 首部,從而回傳整個檔案,狀態碼用 200 , |
安全請求首部
| 首部 | 說明 |
|---|---|
| Authorization | HTTP協議中的 Authorization 請求訊息頭含有服務器用于驗證用戶代理身份的憑證,通常會在服務器回傳401 Unauthorized 狀態碼以及WWW-Authenticate 訊息頭之后在后續請求中發送此訊息頭, |
| Cookie | Cookie 是一個請求首部,其中含有先前由服務器通過 Set-Cookie 首部投放并存盤到客戶端的 HTTP cookies, |
| Cookie2 | 這個已經被廢棄的 Cookie2 請求首部曾經被用來告知瀏覽器該用戶代理支持“新型” cookies,但是現代的用戶代理一般使用 Cookie 來替代 Cookie2, |
代理請求首部
| 首部 | 說明 |
|---|---|
| Max-Forwards | 在通往源端服務器的路徑上,將請求轉發給其他代理或者網關的最大次數,與TRACE方法類似, |
| Proxy-Authorization | Proxy-Authorization 是一個請求首部,其中包含了用戶代理提供給代理服務器的用于身份驗證的憑證,這個首部通常是在服務器回傳了 407 Proxy Authentication Required 回應狀態碼及 Proxy-Authenticate 首部后發送的, |
| Proxy-Connection | 同Connection,不過這個首部是在與代理建立連接時使用, |
3.3.3、回應首部
| 首部 | 說明 |
|---|---|
| Age | Age 訊息頭里包含物件在快取代理中存貯的時長,以秒為單位,Age的值通常接近于0,表示此物件剛剛從原始服務器獲取不久;其他的值則是表示代理服務器當前的系統時間與此應答中的通用頭 Date 的值之差, |
| Retry-After | 在HTTP協議中,回應首部 Retry-After 表示用戶代理需要等待多長時間之后才能繼續發送請求,這個首部主要應用于以下兩種場景:- 當與 503 回應一起發送的時候,表示服務下線的預期時長;- 當與重定向回應一起發送的時候,比如 301 (Moved Permanently,永久遷移),表示用戶代理在發送重定向請求之前需要等待的最短時間, |
| Server | Server 首部包含了處理請求的源頭服務器所用到的軟體相關資訊,避免描述的過于詳細,因為這有可能泄露服務器內部實作細節,或者被攻擊者找到已知安全漏洞, |
| Title | 對于HTML檔案來說,就是HTML文案定的源端給出的標題, 該首部定義與原始的 HTTP/1.0草案,并未列入RFC2616, |
| Warning | Warning 是一個通用報文首部,包含報文當前狀態可能存在的問題,在回應中可以出現多個 Warning 首部,一般來說, Warning 首部可以應用于任何型別的報文,然而一部分警告碼(warn-code)是為快取代理服務器定制的,并且只可以應用在回應報文中,格式: Warning: <warn-code> <warn-agent> <warn-text> [<warn-date>] |
協商首部
如果資源有多種表示方法,服務器可以通過協商首部來傳遞可協商資源有關的資訊,
| 首部 | 說明 |
|---|---|
| Accept-Range | 服務器使用 HTTP 回應頭 **Accept-Ranges** 標識自身支持范圍請求(partial requests),欄位的具體值用于定義范圍請求的單位,當瀏覽器發現 Accept-Ranges頭時,可以嘗試繼續中斷了的下載,而不是重新開始, |
| Vary | Vary 是一個HTTP回應頭部資訊,它決定了對于未來的一個請求頭,應該用一個快取的回復(response)還是向源服務器請求一個新的回復,例如,移動端和桌面端回應內容是不同的,為了防止移動端誤用了桌面端的快取,可以這樣指定Vary: Vary: User-Agent |
安全回應首部
| 首部 | 描述 |
|---|---|
| Proxy-Authenticate | 指定了獲取 proxy server (代理服務器)上的資源訪問權限而采用的身份驗證方式,代理服務器對請求進行驗證,以便它進一步傳遞請求,Proxy-Authenticate 首部需要與 407 Proxy Authentication Required 回應一起發送, |
| Set-Cookie | 回應首部 Set-Cookie 被用來由服務器端向客戶端發送 cookie, |
| Set-Cookie2 | 已廢棄使用,它被服務器用來向客戶端發送 cookie 資料,但是已經在協議中被標記為不贊成使用了,請使用 Set-Cookie 將其代替, |
| WWW-Authenticate | 定義了使用何種驗證方式去獲取對資源的連接,WWW-Authenticate header通常會和一個 401 Unauthorized 的回應一同被發送, |
3.3.4、物體首部
用來描述HTTP報文中物體相關資訊的首部,我們成為物體首部,
| 首部 | 描述 |
|---|---|
| Allow | Allow 首部欄位用于列舉資源所支持的 HTTP 方法的集合, |
| Location | Location 首部指定的是需要將頁面重新定向至的地址,一般在回應碼為3xx的回應中才會有意義:- 303 (See Also) 始終引致請求使用 GET 方法,而,而 307 (Temporary Redirect) 和 308 (Permanent Redirect) 則不轉變初始請求中的所使用的方法;- 301 (Permanent Redirect) 和 302 (Found) 在大多數情況下不會轉變初始請求中的方法,不過一些比較早的用戶代理可能會引發方法的變更;除了重定向回應之外, 狀態碼為 201 (Created) 的訊息也會帶有Location首部,它指向的是新創建的資源的地址, |
內容首部
| 首部 | 描述 |
|---|---|
| Content-Encoding | Content-Encoding 是一個物體訊息首部,用于對特定媒體型別的資料進行壓縮, |
| Content-Languate | Content-Language 用來說明訪問者希望采用的語言或語言組合,這樣的話用戶就可以根據自己偏好的語言來定制不同的內容, |
| Content-Length | 指明發送給接收方的訊息主體的大小,即用十進制數字表示的八位元組的數目, |
| Content-Location | 指定的是要回傳的資料的地址選項,最主要的用途是用來指定要訪問的資源經過內容協商后的結果的URL, |
| Content-MD5 | 訊息主題的MD5校驗和 |
| Content-Range | 描述一個資料片段在整個檔案中的位置 |
| Content-Type | 指示資源的MIME型別 media type |
物體快取首部
物體快取首部提供與被快取物體有關的資訊,如什么時候或者如何快取,快取是否有效等,通過快取首部可以估計快取何時失效,
| 首部 | 描述 |
|---|---|
| ETag | 資源的特定版本的識別符號,這可以讓快取更高效,并節省帶寬,因為如果內容沒有改變,Web服務器不需要發送完整的回應, 如果給定URL中的資源更改,則一定要生成新的Etag值, |
| Expires | 該首部包含日期/時間, 即在此時候之后,回應過期, 無效的日期,比如 0, 代表著過去的日期,即該資源已經過期, |
| Last-Modified | 含源頭服務器認定的資源做出修改的日期及時間, 它通常被用作一個驗證器來判斷接收到的或者存盤的資源是否彼此一致, 由于精確度比 ETag 要低,所以這是一個備用機制,包含有 If-Modified-Since 或 If-Unmodified-Since 首部的條件請求會使用這個欄位, |
3.4、訊息體
3.4.1、請求訊息體
并不是所有的請求都需要body,如:GET,HEAD,DELETE,OPTIONS通產不需要body,
請求body可以分為兩類:
- Single-resource bodies,由單個檔案組成,該型別 body 由兩個 header 定義:
Content-Type和Content-Length; - Multiple-resource bodies,由多部分body組成,每一部分包含不同的資訊位,通常是和 HTML Forms 連系在一起,
3.4.2、回應訊息體
并不是所有的回應都有body,如 201 或 204狀態碼的回應一般不會有body,
回應body可以分為三類:
- Single-resource bodies,由已知長度的單個檔案組成,該型別 body 由兩個 header 定義:
Content-Type和Content-Length; - Single-resource bodies,由未知長度的單個檔案組成,通過將
Transfer-Encoding設定為chunked來使用 chunks 編碼; - Multiple-resource bodies,由多部分 body 組成,每部分包含不同的資訊段,但這是比較少見的,
3.5、狀態行
回應訊息的第一行是狀態行,由協議版本,數字狀態代碼及其關聯的文本短語組成,每個元素由SP字符分隔, 除最后的CRLF序列外,不允許CR或LF,
狀態行格式:
Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
3.5.1、Status-Code狀態碼和Reason-Phrase狀態描述
狀態碼是3位數的整數結果代碼,
狀態碼的第一位數字定義回應的類別, 后兩位數字沒有任何分類作用,可以分為5個類別:
- 1xx:資訊狀態碼,收到請求,繼續進行;
- 2xx:請求成功接收;
- 3xx:重定向,必須采取進一步措施才能完成請求;
- 4xx:客戶端錯誤,請求包含錯誤語法,或者不能被完成;
- 5xx:服務器錯誤,服務器無法完成看似有效的請求;
RFC中定義的狀態碼很多,這里我們列出最常見的一些狀態碼:
| 狀態碼 | 描述 | 詳細說明 |
|---|---|---|
| 101 | Switching Protocol | 該代碼是回應客戶端的 Upgrade 標頭發送的,并且指示服務器也正在切換的協議, |
| 200 | OK | 請求成功, |
| 204 | No Content | 服務器成功處理了請求,但不需要回傳任何物體內容,并且希望回傳更新了的元資訊, 用這個狀態碼區分成功狀態下又回傳內容和沒回傳內容的回應, |
| 206 | Partial Content | 服務器已經成功處理了部分 GET 請求,通過HTTP的分塊下載,獲取資源的部分時回傳,該請求必須包含 Range 頭資訊來指示客戶端希望得到的內容范圍,并且可能包含 If-Range 來作為請求條件, 206狀態碼通常會攜帶 Content-Range,用于表示報文里面body資料的具體范圍, |
| 301 | Moved Permanently | 永久重定向,將來任何對此資源的參考都應該使用本回應回傳的若干個 URI 之一, |
| 302 | Found | 臨時重定向,客戶端下次應當繼續向原有地址發送以后的請求,只有在Cache-Control或Expires中進行了指定的情況下,這個回應才是可快取的, |
| 304 | Not Modified | 如果客戶端發送了一個帶條件的 GET 請求且該請求已被允許,而檔案的內容(自上次訪問以來或者根據請求的條件)并沒有改變,則服務器應當回傳這個狀態碼,304 回應禁止包含訊息體,因此始終以訊息頭后的第一個空行結尾, |
| 400 | Bad Request | 語意有誤,當前請求無法被服務器理解,除非進行修改,否則客戶端不應該重復提交這個請求, |
| 401 | Unauthorized | 當前請求需要用戶驗證,該回應必須包含一個適用于被請求資源的 WWW-Authenticate 資訊頭用以詢問用戶資訊,客戶端可以重復提交一個包含恰當的 Authorization 頭資訊的請求, |
| 403 | Forbidden | 服務器已經理解請求,但是拒絕執行它,如果這不是一個 HEAD 請求,而且服務器希望能夠講清楚為何請求不能被執行,那么就應該在物體內描述拒絕的原因,當然服務器也可以回傳一個 404 回應,假如它不希望讓客戶端獲得任何資訊, |
| 404 | Not Found | 請求失敗,請求所希望得到的資源未被在服務器上發現, 究竟是不是真的資源不存在呢?還得看程式是怎么寫的, |
| 405 | Method Not Allowed | 請求行中指定的請求方法不能被用于請求相應的資源,該回應必須回傳一個Allow 頭資訊用以表示出當前資源能夠接受的請求方法的串列, |
| 408 | Request Timeout | 請求超時,客戶端沒有在服務器預備等待的時間內完成一個請求的發送,客戶端可以隨時再次提交這一請求而無需進行任何更改, |
| 409 | Conflict | 由于和被請求的資源的當前狀態之間存在沖突,請求無法完成, |
| 413 | Payload Too Large | 請求提交的物體資料大小超過了服務器愿意或者能夠處理的范圍,此種情況下,服務器可以關閉連接以免客戶端繼續發送此請求,如果這個狀況是臨時的,服務器應當回傳一個 Retry-After 的回應頭,以告知客戶端可以在多少時間以后重新嘗試, |
| 429 | Too Many Requests | 用戶在給定的時間內發送了太多請求(“限制請求速率”), |
| 431 | Request Header Fields Too Large | 請求頭欄位太大( Request Header Fields Too Large) |
| 500 | Internal Server Error | 服務器遇到了不知道如何處理的情況,通常用來捕獲服務器例外,統一回傳500,避免輸出詳細錯誤堆疊給別人利用, |
| 501 | Not Implemented | 此請求方法不被服務器支持且無法被處理,只有GET和HEAD是要求服務器支持的,它們必定不會回傳此錯誤代碼, |
| 502 | Bad Gateway | 此錯誤回應表明服務器作為網關需要得到一個處理這個請求的回應,但是得到一個錯誤的回應, |
| 503 | Service Unavailable | 服務器沒有準備好處理請求, 常見原因是服務器因維護或多載而停機, |
| 504 | Gateway Timeout | 當服務器作為網關,不能及時得到回應時回傳此錯誤代碼, |
更多狀態碼說明:
- List of HTTP status codes[5]
- https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status[6]
上面我們把HTTP報文介紹了一遍,HTTP作為一個協議,只是規定了大家要遵循這樣的約定,但是具體實作的時候,還是要看應用程式的兼容程度,我們在寫程式的時候,也不要跟協議對著干,這會讓對接的同事無法理解的,
你都知道以下狀態碼的含義了嗎?
200 204 206 301 302 304 401 403 405 500 501 502 503 504
本文首次發表于: HTTP/1.1報文詳解 以及公眾號 Java架構雜談,未經許可,不得轉載,
本文為arthinking基于相關技術資料和官方檔案撰寫而成,確保內容的準確性,如果你發現了有何錯漏之處,煩請高抬貴手幫忙指正,萬分感激,
如果您覺得讀完本文有所識訓的話,可以關注我的賬號,或者點贊吧,碼字不易,您的支持就是我寫作的最大動力,再次感謝!
為了把相關系列文章收集起來,方便后續查閱,這里我創建了一個Github倉庫,把發布的文章按照分類收集起來了,感興趣的朋友可以Star跟進:
https://github.com/arthinking/java-tech-stack

關注我的博客IT宅(itzhai.com)或者公眾號Java架構雜談,及時獲取最新的文章,我將持續更新后端相關技術,涉及JVM、Java基礎、架構設計、網路編程、資料結構、資料庫、演算法、并發編程、分布式系統等相關內容,
References
- 謝希仁. 計算機網路(第6版). 電子工業出版社.
- TCP/IP詳解 卷1:協議(原書第2版). 機械工業出版社.
- UNIX網路編程 卷1:套接字聯網API. 人民郵電出版社
- HTTP權威指南. 人民郵電出版社
- HTTP/2基礎教程. 人民郵電出版社
- 劉超. 趣談網路協議. 極客時間
- 羅劍鋒. 透視HTTP協議. 即可時間
本文同步發表于我的博客IT宅(itzhai.com)和公眾號(Java架構雜談)
作者:arthinking | 公眾號:Java架構雜談
博客鏈接:https://www.itzhai.com/articles/detailed-explanation-of-http-1-1-messages.html
著作權宣告: 著作權歸作者所有,未經許可不得轉載,侵權必究!聯系作者請加公眾號,
Hypertext Transfer Protocol -- HTTP/1.1 2616. Retrieved from https://tools.ietf.org/html/rfc2616 ?? ??
HTTP. MDN web docs. Retrieved from https://developer.mozilla.org/zh-CN/docs/Web/HTTP ??
CONNECT. Retrieved from https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Methods/CONNECT ??
HTTP Headers. Retrieved from https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers ??
List of HTTP status codes. Retrieved from https://en.wikipedia.org/wiki/List_of_HTTP_status_codes ??
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status. Retrieved from https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status ??
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/263187.html
標籤:Java
