主頁 > 後端開發 > HTTP/1.1報文詳解

HTTP/1.1報文詳解

2021-02-25 06:13:34 後端開發

本文為《三萬長文50+趣圖帶你領悟web編程的內功心法》第三個章節,

3、HTTP/1.1報文詳解

在RFC2616中心詳細的描述了HTTP/1.1[1]的報文,感興趣的朋友也可以前往閱讀,

HTTP是基于TCP的,HTTP作為應用層協議,會在TCP/IP協議堆疊往下傳遞的時候,不斷封裝資料幀,如下圖:

image-20200818221423546

上面HTTP正文即是以我們HTTP報文格式來組織的,下面我們看看具體的HTTP報文的格式,

3.1、HTTP報文組成部分

HTTP請求和回應都使用如下通用的格式:

image-20200819224006001

  • 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]:可選的訊息體;

可以分別把請求報文和回應報文分開來描述:

請求報文

image-20200822180651813

回應報文

image-20200822180702049

可以發現,請求報文和回應報文格式就起始行不一樣,

下面我們逐個來介紹,

為了盡可能保證內容的準確性,下面報文各種欄位說明部分內容,大部分整理自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方法與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,統一資源定位符,描述了一臺特定服務器上某個資源的特定位置,例如上面的鏈接就是一個統一資源定位符:

image-20200813221737724

  • scheme方案:指定方位資源所使用的協議型別,如HTTPS;
  • 主機與埠:英特網地址,即域名,這里默認為80埠;
  • 路徑:其余部分指定web服務器上的某個資源,

幾乎所有的 URI都是URL,

一個完整的URL格式如下:

image-20200824232924494

  • 用戶名和密碼:有寫服務器要求輸入用戶名和密碼才允許用戶訪問資料,如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 對于 GETHEAD 請求方法來說,當且僅當服務器上沒有任何資源的 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-SinceIf-Unmodified-Since 首部的條件請求會使用這個欄位,

3.4、訊息體

3.4.1、請求訊息體

并不是所有的請求都需要body,如:GET,HEAD,DELETE,OPTIONS通產不需要body,

請求body可以分為兩類:

  • Single-resource bodies,由單個檔案組成,該型別 body 由兩個 header 定義: Content-TypeContent-Length
  • Multiple-resource bodies,由多部分body組成,每一部分包含不同的資訊位,通常是和 HTML Forms 連系在一起,

3.4.2、回應訊息體

并不是所有的回應都有body,如 201204狀態碼的回應一般不會有body,

回應body可以分為三類:

  • Single-resource bodies,由已知長度的單個檔案組成,該型別 body 由兩個 header 定義:Content-TypeContent-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 此請求方法不被服務器支持且無法被處理,只有GETHEAD是要求服務器支持的,它們必定不會回傳此錯誤代碼,
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

java-tech-stack-info

關注我的博客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

著作權宣告: 著作權歸作者所有,未經許可不得轉載,侵權必究!聯系作者請加公眾號,


  1. Hypertext Transfer Protocol -- HTTP/1.1 2616. Retrieved from https://tools.ietf.org/html/rfc2616 ?? ??

  2. HTTP. MDN web docs. Retrieved from https://developer.mozilla.org/zh-CN/docs/Web/HTTP ??

  3. CONNECT. Retrieved from https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Methods/CONNECT ??

  4. HTTP Headers. Retrieved from https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers ??

  5. List of HTTP status codes. Retrieved from https://en.wikipedia.org/wiki/List_of_HTTP_status_codes ??

  6. 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

上一篇:死磕Spring之IoC篇 - BeanDefinition 的決議階段(XML 檔案)

下一篇:Redis原始碼入門-字串sds,sdshdr

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more