iT邦幫忙

2024 iThome 鐵人賽

DAY 18
1
Software Development

從零開始的後端學習之旅系列 第 18

DAY18 狀態碼這麼多怎麼分?搞懂 HTTP 回應的5大類別!

  • 分享至 

  • xImage
  •  

前言

之前的文章中探討了HTTP封包結構,特別是請求開頭的request line和狀態行(status line),這些部分包含了請求方法、URI、協定版本、狀態碼及其敘述等元素。今天的文章會來介紹 HTTP 回應中一個非常重要的部分——狀態碼。這些狀態碼不僅告訴我們請求的結果,還能幫助我們理解伺服器的反應,那就趕快來進入正題吧~
/images/emoticon/emoticon07.gif

什麼是 HTTP status codes?為什麼需要它?

在 1997 年發布的初版 HTTP/1.1 規範,也就是RFC 2068中,定義了基礎的 HTTP 狀態碼(status codes),不過對於狀態碼的描述卻有些不夠明確,因此在隨後發布的RFC 2616對於狀態碼的有更加詳細的定義,而且明確敘述了各個狀態碼的語義以及使用情境。而在之後的RFC 7231以及RFC 9110對於狀態碼也有一些變動,本文章主要會參考 RFC 9110的內容。

HTTP狀態碼是一個三位數的程式碼,用來描述請求的結果及回應的語義,包括請求是否成功以及包含的內容(如果有)。而透過標準化的回應內容,使用者在收到回應時能快速做出相應的處理;同時,開發者也能迅速辨識出錯誤回應的狀態碼,找出問題所在。這種一致性的規範使得不同系統之間的溝通更為有效率,無需花費額外時間確認狀態,對於使用者和開發者都是非常重要的。

HTTP status codes 有哪些種類?

先來看看官方文件說了什麼:

The first digit of the status code defines the class of response. The last two digits do not have any categorization role. There are five values for the first digit
A client is not required to understand the meaning of all registered status codes, though such understanding is obviously desirable. However, a client MUST understand the class of any status code, as indicated by the first digit, and treat an unrecognized status code as being equivalent to the x00 status code of that class.

HTTP 的狀態碼是有結構化的,客戶端並不需要理解所有的狀態碼,不過必須要知道每個狀態碼的類別是什麼,並且在遇到無法識別的狀態碼時會自動根據所屬的類別進行處理。而根據規範,狀態碼是依據第一個數字進行分類,而主要分成以下五大類別:

  1. 1xx狀態碼:這類狀態碼代表臨時回應,主要用於傳達連接狀態或請求的進度。例如,當YouTube用戶上傳影片時,客戶端可能會首先發出請求,以確認伺服器是否準備好接收數據,或檢查請求是否存在問題(可能用戶並沒有權限發布影片)。這樣做可以避免直接將所有數據上傳,從而減少流量浪費和伺服器負擔。發出請求時可能會有以下流程:
    客戶端發出請求:

         POST /upload HTTP/1.1
         Host: youtube.com
         Content-Type: image/jpeg
         Content-Length: 5000000
         Expect: 100-continue
    

    伺服器回應:

         HTTP/1.1 100 Continue
    

    這個時候用戶端才會開始上傳資料

  2. 2xx狀態碼:表示客戶端的請求已經被成功理解並接收。

  3. 3xx狀態碼:重定向,代表使用者代理程式需要採取進一步的操作才能滿足請求。例如,當你想要使用ChatGpt並要進行註冊時,會出現以下畫面:
    https://ithelp.ithome.com.tw/upload/images/20241002/20167721nwnVHSyJgH.png
    而當你點選使用Google帳戶繼續,使用第三方登入的服務時,伺服器可能就會返回302 Found狀態碼,告訴客戶端重定向到第三方認證頁面,回應可能如下:

         HTTP/1.1 302 Found
         Location: https://accounts.google.com/o/oauth2/auth?client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&response_type=code
    

    而此時客戶端就會自動重定向到Google的登入頁面。

  4. 4xx狀態碼:代表客戶端可能出現了錯誤。例如,常見到的404 Not Found,出現的狀況可能是手動輸入 URL 時輸入錯誤,或是網站的 URL 已經變動,使用者點選到的連結沒有更新,導向到錯誤的頁面。

  5. 5xx狀態碼:代表伺服器端可能出現了錯誤。例如,今年各位在搶周杰倫的演唱會門票時,可能會出現下列畫面,代表太多人在搶票,伺服器可能GG了
    https://ithelp.ithome.com.tw/upload/images/20241002/20167721gBjczCCKeC.jpg
    這時候就只能去下水道聽歌了
    https://ithelp.ithome.com.tw/upload/images/20241002/20167721xnOiar8T97.png

小結

今天大致介紹了關於 HTTP 狀態碼的分類,以及為什麼需要分出這些類別,以後在設計 API 的時候記得要好好遵守這個規範,以免前端在打你的 API 的時候,看不懂回應在寫什麼東西唷!
/images/emoticon/emoticon07.gif

參考資料

RFC 9110
How to Think About HTTP Status Codes
MDN


上一篇
DAY17 從 TCP 到 QUIC 改變了什麼?
下一篇
DAY19 HTTP 到 HTTPs 改變了什麼?只是多加了 1 個 S 嗎?
系列文
從零開始的後端學習之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言