一文搞懂 Http Status Code,詳細解析 200、301、401、403、500、503

古古

2024/08/20


什麼是 Http Status Code(Http 狀態碼)? #

所謂的「Http Status Code」,中文是翻譯成「Http 狀態碼」,而他的目的,就是 「用一個簡短的值,快速的表示當前 API 的請求結果是什麼」。所以舉例來說的話,大家常見的「200」的回覆,其實就是表示這一次的 API 請求成功了,就只是這麼簡單的用途而已。

所以像是在下圖中,當我們請求 GET http://localhost:8080/hello 這個 API 時,這個 API 就會回傳 200 的返回結果給我們(綠底處),所以就可以讓我們快速的知道,這一次的請求是成功的這樣。

題外話補充一下,滿推薦大家可以下載上面這個 Chrome 的擴充功能 - Talend API Tester 的,我個人真的是超喜歡這個擴充功能,因為他會用超大的區塊 + 顏色來呈現 Http Status Code,非常的直覺好用!(反觀下圖的 Postman,他的 Http Status Code 就是小小的在右上角,真的很不明顯🥹)

而在 Http Status Code 的世界裡面,除了有「200」這個值可以使用之外,也是有其他的返回值可以使用的,而這些 Http Status Code 的返回值,我們是可以根據他們的 首位數字,去分成是五個大類:

  • 1xx : 資訊
  • 2xx:成功
  • 3xx:重新導向
  • 4xx:前端請求錯誤
  • 5xx:後端處理有問題

所以舉例來說的話,但凡是 2 開頭的 Http Status Code,不管你是 200、201、還是 202…等等,只要你是 2 開頭,那就是屬於「2xx」那一個大類,就都是表示「成功」的意思。

又或是說 400、401、403…等等的這些值,因為他們都是 4 開頭,所以他們就都是屬於「4xx」那一個大類,所以就都是表示「前端請求錯誤」的意思。

所以透過這個 Http Status Code,我們就可以快速的知道,這一次 API 的請求結果為何了!

常見的 Http Status Code #

在我們了解了 Http Status Code 的用途之後,接下來我們就可以來看一下,常見的 Http Status Code 有哪些(以下分別介紹各大類常使用的值)。

1xx:資訊 #

很神奇的是,明明 Http Status Code 有定義 1xx 這個分類出來,但是在實際的應用中,基本上很少很少會用到 1xx 的返回值,因此在這個大類裡面,沒有常見的 Http Status Code。

2xx:成功 #

在 2xx 開頭的大類中,所有的 Http Status Code,就都是表示 「請求成功」 的意思。而在 2xx 的大類裡面,常見的 Http Status Code,就有 200、201、以及 202。

200 OK #

首先是「200 OK」,200 這個 Http Status Code,這個估計是大家最最最熟悉的值XD,就是表示這一次的 API 請求成功了的意思。

不過大家觀察一下的話,就可以發現,在 200 的後面,多了一個「OK」的英文單詞,而這個「OK」的英文單詞,其實就是每一個 Http Status Code 的專屬短語,就是簡單描述一下當前這個 Http Status Code 的用途是什麼。

所以像是「200 OK」裡面的這個「OK」,就是表示 200 這個 Http Status Code,他的意義是代表請求成功的意思。

不過老實說,這個短語其實幫助不大😂(我個人感覺啦),每次遇到不熟悉的 Http Status Code 時,還是得要乖乖的上網查詢他的用途,而那些常見的 Http Status Code(ex: 401、403、500),又已經熟悉到像呼吸一樣自然,不需要看短語就也可以直接回想起他的意思,所以這個短語的用途,大家就作為參考就好~

201 Created #

在 2xx 的大類中,另一個常見的 Http Status Code 則是「201 Created」,201 所代表的,不僅僅是請求成功而已,他還有另一個含義,就是「有一個新的資源被成功創建出來了」。

所以當 API 返回 201 的時候,就是表示這一次的請求成功、並且也有成功的去創建一筆數據出來,而也因為在 REST 風格中,POST 方法通常就是拿來表示對應到資料庫的 Create 操作,因此「201 Created」這個 Http Status Code,通常就是會用在 POST 方法的 API 返回值上(就是用來表示有一個數據被創建出來了)。

補充:不熟悉 RESTful API 的話,可以參考這篇 RESTful API 設計指南 文章的介紹

202 Accepted #

而在 2xx 的大類中,「202 Accepted」所代表的,是「這一次的請求已經被接受,但是尚未處理完成」這樣。

所以當前端收到 202 的返回值時,前端就可以知道,後端已經有收到這一次的請求了,但是因為這個任務實在要做太久,所以後端就先返回 202 的 Http Status Code 給前端,用來表示「我已經開始做了!」的意思,所以當前端收到 202 之後,前端就可以先去處理其他的事情,而不用被這個 API 給 blocked 住這樣。

3xx : 重新導向 #

看完了 2xx 的大類之後,接下來我們接著來看 3xx 的大類。

在 3xx 開頭的大類中,所有的 Http Status Code,就都是表示 「重新導向」 的意思。而在 3xx 的大類中,常見的 Http Status Code,有 301 和 302

301 Moved Permanently #

所謂的「301 Moved Permanently」,就是表示這個 url 「永久的」 搬家了,注意這裡的關鍵字是「永久的」。

所以假設當前端去請求某個 API,但是該 API 返回 301 時,那這時候就是表示,前端所請求的這個 API 的 url,他已經永久搬家了,而至於這個 API 搬去哪裡呢?通常就是會放在 Response header 的 Location,告訴前端說「我搬去了哪裡」。

所以前端就可以再去請求 Response Header 中的這個新的 url,進而就可以真正的取得到新的 API 所返回的數據了。

舉例來說的話,像是我之前在架設個人網站時,就有從 https://kucw.github.io ,搬家到 https://kucw.io ,所以現在如果請求舊的 https://kucw.github.io 的網站的話,就會返回 301 的 Http Status Code,告訴前端這個網站已經永久性的搬家了,並且會將新家的網址(也就是 https://kucw.io ),放在 Response header 中的 Location 的裡面。

302 Found #

如果說 301 是表示「永久的」搬家的話,那麼「302 Found」所表示的,就是 url「暫時性」的搬家。

所以假設某個 API,他只是「暫時性」的搬家的話(ex: 這個 API 目前可能正在調整功能中),那麼就可以回傳 302 的值給前端,就是去告訴前端,你這一次先去請求這個臨時的 url 這樣。

所以 302 和 301 一樣,就都是會將新的 url,放在 Response header 的 Location 裡面,告訴前端「我搬去了哪裡」,就讓前端可以再去 call Location 中所提供的網址,找到確切的新 url。

不過老實說,對於後端工程師而言,通常是感覺不太到 301 和 302 的差別,反正他們就都是表示 url 搬家的意思,只不過 301 是永久性的搬家、而 302 是暫時性的搬家而已。

但是對於 SEO 而言,301 和 302 可是天差地遠的!301 是能夠將網頁的權重、流量、排名,一口氣轉移到新的網站,而 302 則沒辦法,所以對於有在經營 SEO 的團隊而言,分清楚 301 和 302 所帶來的影響還是滿重要的。

不過我也是因為有在經營自媒體,所以才會知道 301、302 對 SEO 的影響,大家如果是純後端工程師的話,其實不用了解的那麼詳細,只要知道 301 是「永久性」的搬家、302 是「暫時性」的搬家,這樣子就可以了~

4xx : 前端請求錯誤 #

了解了 3xx 的大類之後,接下來我們終於可以進到 4xx 的大類了!

在 4xx 開頭的大類中,所有的 Http Status Code,都是表示 「前端請求錯誤」 的意思,所以這也是變相的表示,只要看到 4xx,第一時間應該是要回頭去檢查,自己 call API 時的參數有沒有帶對、或是 url 有沒有填寫正確…等等,反正就是要回頭檢查請求的參數就對了。

在 4xx 的大類中,常見的 Http Status Code,有 400、401、403、以及 404,以下分別介紹他們的用途。

400 Bad Request #

只要在請求 API 時看到「400 Bad Request」,那通常就是表示,前端在請求這個 API 時,他的參數名字可能帶錯了、參數的格式可能寫錯了…等等,反正就是前後端之間的「請求參數」喬不攏,所以才會出現 400 的錯誤。

因此只要看到 400 的錯誤,就可以回頭檢查一下,是否在 call 此 API 時,有帶上正確格式的參數。

401 Unauthorized #

接下來是 4xx 類別中的重頭戲了!401 和 403,他們可以說是大家最容易搞混的兩個 Http Status Code,但是又因為他們真的很常出現,所以搞懂他們之間的差別還是很重要的。

所謂的「401 Unauthorized」,是表示這一次的請求「沒有通過身份驗證」,所以就是表示前端在請求 API 的時候,沒有去帶上使用者的帳號密碼、或是沒有去帶上 Token,也就是沒有帶上「身分證」,所以後端就沒有辦法去辨認說,這一次的請求到底是哪位使用者發起的(後端:你到底是叫小明、還是叫老王,你倒是給我個身分證啊!),因此後端就只好回傳 401 的錯誤,表示這一次的請求沒有通過身份驗證。

所以只要看到 401,通常就是表示「認證失敗」,也就是你連個身分證(ex: 帳號密碼、Token)都沒帶在身上,後端無法辨認出你到底叫做什麼名字,才導致請求失敗。

或是大家也可以把這個 401,簡單的想像成是會員的身份驗證錯誤,譬如說帳號密碼輸入錯誤的情況。所以在這種情況,後端就會返回 401 的錯誤,就告訴前端說,這個人並不是我們網站的會員。

403 Forbidden #

而至於「403 Forbidden」,他的概念就不太一樣了。

所謂的 403,是表示這一次的請求「權限不足」,譬如說當一個普通會員,他想要收看 VIP 會員才能看的影片的時候,那這時候,因為這個普通會員的「權限不足」,因此後端就會返回 403 的錯誤給前端,就告訴前端說,這個普通會員的權限不足,因此我們不能讓他收看 VIP 會員才能看的影片。

所以總結來說的話:

  • 當前端在請求時,如果連身分證(ex: Token)都沒帶在身上,那後端就會直接回傳 401 的錯誤,表示「身份認證失敗」,因為後端不知道這一次來請求的使用者到底是誰。
  • 如果前端有帶上身分證,但是當這個身分證的人,他的權限不足的話(ex: 普通會員想要收看 VIP 會員的影片),那後端則是會回傳 403 的錯誤,表示「權限不足」。

因此 401 和 403,他們可以說是關係非常緊密的兩個 Http Status Code,所以就建議大家,一定要搞清楚他們之間的差別會比較好!

404 Not Found #

OK 那在 4xx 的大類中,最後一個常見的 Http Status Code,就是「404 Not Found」。

404 可以說是一個大家在日常生活中,也滿接觸到的 Http Status Code,那 404 的意思,就是表示這個網頁不存在,也就是前端所請求的 url 已經失效、或是 url 的值輸入錯誤,反正就是這個網頁已經不存在就對了。

5xx : 後端處理有問題 #

呼~看完了前面那麼多的大類,最後我們就進到最後一個大類,也就是 5xx 這個大類。

那在 5xx 開頭的大類中,所有的 Http Status Code,就都是表示 「後端處理有問題」 的意思,所以這也是變相的表示,只要看到 5xx,就是表示後端這邊的程式出了問題,所以就要第一時間去檢查後端的程式哪裡有寫錯、或是哪個 Server 又壞掉了這樣。

也因為 5xx 所表示的,就是後端處理有問題,所以身為一個後端工程師,最怕的就是工作上看到一堆 5xx 的 Http Status Code,因為這就表示後端又出問題,今天晚上我們又要加班了🥹。所以在這眾多的 Http Status Code 中,最讓後端工程師聞風喪膽的,就是 5xx 這類的 Http Status Code。

而在 5xx 的大類中,常見的 Http Status Code,有 500、503、以及 504,這三個 Http Status Code。

500 Internal Server Error #

首先是「500 Internal Server Error」,500 的意思是表示,後端在處理這一次請求的時候發生了錯誤,那這個錯誤可能是因為程式內有 bug、或是其他後端相關的原因所導致的,所以後端工程師這時候就必須要回頭去檢查,是不是哪一段程式寫錯了…等等,進而去解決這個問題。

那 500 其實是一個滿通用的 Http Status Code,基本上後端的程式出現 Error、或是噴出 Exception 時,常見的後端框架(像是 Spring Boot),都會自動將他轉為 500 的錯誤,然後返回給前端。因此在實作上,只要是沒有特殊處理過的 Error,通常就是會以 500 的錯誤返回給前端。

503 Service Unavailable #

再來是「503 Service Unavailable」,503 的意思是表示,目前因為「臨時維護」或是「流量太大」,導致後端沒有辦法處理這個 API 的請求。因此當前端收到 503 時,就是表示伺服器現在非常的忙碌,沒有辦法正常的運作,所以前端只能夠稍後再重試一次,直到後端的伺服器恢復正常為止。

不過這裡要特別補充一下,其實 503 並不一定都是不好的錯誤,譬如說遊戲內常見的停機維護,這種會提前預告時間的臨時維護,如果在維護期間去 call API 的話,理論上也是會得到 503 的錯誤的。

所以大家當看到 503 時,就不用太緊張,因為他有可能是真的在進行「已知的臨時維護」,除非他現在明明不是維護時間,但是又出現 503,這時候才有可能是因為「短時間內流量太大,後端真的撐不住了」所導致的錯誤,所以只有這個時候,才會需要後端工程師和 DevOps 工程師,趕快進去查看伺服器遇到了什麼狀況,進而去排除這個問題。

504 Gateway Timeout #

最後一個常見的 Http Status Code,就是「504 Gateway Timeout」,504 所表示的,就是這一次的請求超時了,所以中間的代理層就直接強制結束,直接回傳 504 的錯誤給前端。

所以舉例來說,當前端去請求後端的 API 時,如果後端處理了太久的時間(譬如說 20 分鐘之類的),這時候中間的 Cloudflare 代理層就會認為,這個後端實在是處理得太久了,這樣一直無止盡的等下去也不是辦法,所以中間的 Cloudflare 就會直接卡掉這個請求,並且回傳 504 的錯誤給前端,表示這個請求實在做太久,已經超過容許的等待時間了。

所以當 504 出現的時候,這時候後端工程師就要去查看說,是否有哪一個環節出了問題,導致程式執行過久,才會出現 504 的超時錯誤。

Http Status Code 總結 #

所以總結來說的話,透過上面的介紹,我們就是針對了常見的 Http Status Code,去解析每一個 Http Status Code 的意義分別是什麼。

那如果我們回頭來看一下 Http Status Code 的定義的話,所謂的「Http Status Code」,就是 「用一個簡短的值,快速的表示當前 API 的請求結果是什麼」

而這些 Http Status Code 的返回值,我們就是可以根據他們的 首位數字,去分成是五個大類:

  • 1xx : 資訊
  • 2xx:成功
  • 3xx:重新導向
  • 4xx:前端請求錯誤
  • 5xx:後端處理有問題

所以當大家以後看到 4xx 的值時,就可以快速的知道,他們就都是表示「前端請求錯誤」的意思;而看到 5xx 的值時,就也可以知道,這是表示出現了「後端處理有問題」的錯誤。

因此透過這個 Http Status Code,就可以快速的去知道,這一次 API 的請求結果為何了~

PS: 補充一下,其實 Http Status Code 有一個比較好記(但是也比較兇)的版本,這邊就也寫出來跟大家分享,但就…希望大家還是和平共處🤣,前端後端一家親的對吧!

  • 1xx : 資訊
  • 2xx:成功
  • 3xx:搬家了啦
  • 4xx:前端又在雷
  • 5xx:後端又在雷

結語 #

這篇文章我們有去介紹了什麼是 Http Status Code,並且也有詳細的介紹了每一個大類中(ex: 1xx、2xx、3xx…),常見的 Http Status Code 有哪些。

如果你對後端技術有興趣的話,也歡迎免費訂閱 《古古的後端筆記》電子報 ,每週二為你送上一篇後端技術分享,那我們就下一篇文章見啦!