所謂的「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 的返回值,我們是可以根據他們的 首位數字,去分成是五個大類:
所以舉例來說的話,但凡是 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 這個分類出來,但是在實際的應用中,基本上很少很少會用到 1xx 的返回值,因此在這個大類裡面,沒有常見的 Http Status Code。
在 2xx 開頭的大類中,所有的 Http Status Code,就都是表示 「請求成功」 的意思。而在 2xx 的大類裡面,常見的 Http Status Code,就有 200、201、以及 202。
首先是「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),又已經熟悉到像呼吸一樣自然,不需要看短語就也可以直接回想起他的意思,所以這個短語的用途,大家就作為參考就好~
在 2xx 的大類中,另一個常見的 Http Status Code 則是「201 Created」,201 所代表的,不僅僅是請求成功而已,他還有另一個含義,就是「有一個新的資源被成功創建出來了」。
所以當 API 返回 201 的時候,就是表示這一次的請求成功、並且也有成功的去創建一筆數據出來,而也因為在 REST 風格中,POST 方法通常就是拿來表示對應到資料庫的 Create 操作,因此「201 Created」這個 Http Status Code,通常就是會用在 POST 方法的 API 返回值上(就是用來表示有一個數據被創建出來了)。
補充:不熟悉 RESTful API 的話,可以參考這篇 RESTful API 設計指南 文章的介紹
而在 2xx 的大類中,「202 Accepted」所代表的,是「這一次的請求已經被接受,但是尚未處理完成」這樣。
所以當前端收到 202 的返回值時,前端就可以知道,後端已經有收到這一次的請求了,但是因為這個任務實在要做太久,所以後端就先返回 202 的 Http Status Code 給前端,用來表示「我已經開始做了!」的意思,所以當前端收到 202 之後,前端就可以先去處理其他的事情,而不用被這個 API 給 blocked 住這樣。
看完了 2xx 的大類之後,接下來我們接著來看 3xx 的大類。
在 3xx 開頭的大類中,所有的 Http Status Code,就都是表示 「重新導向」 的意思。而在 3xx 的大類中,常見的 Http Status Code,有 301 和 302。
所謂的「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 的裡面。
如果說 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 是「暫時性」的搬家,這樣子就可以了~
了解了 3xx 的大類之後,接下來我們終於可以進到 4xx 的大類了!
在 4xx 開頭的大類中,所有的 Http Status Code,都是表示 「前端請求錯誤」 的意思,所以這也是變相的表示,只要看到 4xx,第一時間應該是要回頭去檢查,自己 call API 時的參數有沒有帶對、或是 url 有沒有填寫正確…等等,反正就是要回頭檢查請求的參數就對了。
在 4xx 的大類中,常見的 Http Status Code,有 400、401、403、以及 404,以下分別介紹他們的用途。
只要在請求 API 時看到「400 Bad Request」,那通常就是表示,前端在請求這個 API 時,他的參數名字可能帶錯了、參數的格式可能寫錯了…等等,反正就是前後端之間的「請求參數」喬不攏,所以才會出現 400 的錯誤。
因此只要看到 400 的錯誤,就可以回頭檢查一下,是否在 call 此 API 時,有帶上正確格式的參數。
接下來是 4xx 類別中的重頭戲了!401 和 403,他們可以說是大家最容易搞混的兩個 Http Status Code,但是又因為他們真的很常出現,所以搞懂他們之間的差別還是很重要的。
所謂的「401 Unauthorized」,是表示這一次的請求「沒有通過身份驗證」,所以就是表示前端在請求 API 的時候,沒有去帶上使用者的帳號密碼、或是沒有去帶上 Token,也就是沒有帶上「身分證」,所以後端就沒有辦法去辨認說,這一次的請求到底是哪位使用者發起的(後端:你到底是叫小明、還是叫老王,你倒是給我個身分證啊!),因此後端就只好回傳 401 的錯誤,表示這一次的請求沒有通過身份驗證。
所以只要看到 401,通常就是表示「認證失敗」,也就是你連個身分證(ex: 帳號密碼、Token)都沒帶在身上,後端無法辨認出你到底叫做什麼名字,才導致請求失敗。
或是大家也可以把這個 401,簡單的想像成是會員的身份驗證錯誤,譬如說帳號密碼輸入錯誤的情況。所以在這種情況,後端就會返回 401 的錯誤,就告訴前端說,這個人並不是我們網站的會員。
而至於「403 Forbidden」,他的概念就不太一樣了。
所謂的 403,是表示這一次的請求「權限不足」,譬如說當一個普通會員,他想要收看 VIP 會員才能看的影片的時候,那這時候,因為這個普通會員的「權限不足」,因此後端就會返回 403 的錯誤給前端,就告訴前端說,這個普通會員的權限不足,因此我們不能讓他收看 VIP 會員才能看的影片。
所以總結來說的話:
因此 401 和 403,他們可以說是關係非常緊密的兩個 Http Status Code,所以就建議大家,一定要搞清楚他們之間的差別會比較好!
OK 那在 4xx 的大類中,最後一個常見的 Http Status Code,就是「404 Not Found」。
404 可以說是一個大家在日常生活中,也滿接觸到的 Http Status Code,那 404 的意思,就是表示這個網頁不存在,也就是前端所請求的 url 已經失效、或是 url 的值輸入錯誤,反正就是這個網頁已經不存在就對了。
呼~看完了前面那麼多的大類,最後我們就進到最後一個大類,也就是 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 的意思是表示,後端在處理這一次請求的時候發生了錯誤,那這個錯誤可能是因為程式內有 bug、或是其他後端相關的原因所導致的,所以後端工程師這時候就必須要回頭去檢查,是不是哪一段程式寫錯了…等等,進而去解決這個問題。
那 500 其實是一個滿通用的 Http Status Code,基本上後端的程式出現 Error、或是噴出 Exception 時,常見的後端框架(像是 Spring Boot),都會自動將他轉為 500 的錯誤,然後返回給前端。因此在實作上,只要是沒有特殊處理過的 Error,通常就是會以 500 的錯誤返回給前端。
再來是「503 Service Unavailable」,503 的意思是表示,目前因為「臨時維護」或是「流量太大」,導致後端沒有辦法處理這個 API 的請求。因此當前端收到 503 時,就是表示伺服器現在非常的忙碌,沒有辦法正常的運作,所以前端只能夠稍後再重試一次,直到後端的伺服器恢復正常為止。
不過這裡要特別補充一下,其實 503 並不一定都是不好的錯誤,譬如說遊戲內常見的停機維護,這種會提前預告時間的臨時維護,如果在維護期間去 call API 的話,理論上也是會得到 503 的錯誤的。
所以大家當看到 503 時,就不用太緊張,因為他有可能是真的在進行「已知的臨時維護」,除非他現在明明不是維護時間,但是又出現 503,這時候才有可能是因為「短時間內流量太大,後端真的撐不住了」所導致的錯誤,所以只有這個時候,才會需要後端工程師和 DevOps 工程師,趕快進去查看伺服器遇到了什麼狀況,進而去排除這個問題。
最後一個常見的 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」,就是 「用一個簡短的值,快速的表示當前 API 的請求結果是什麼」。
而這些 Http Status Code 的返回值,我們就是可以根據他們的 首位數字,去分成是五個大類:
所以當大家以後看到 4xx 的值時,就可以快速的知道,他們就都是表示「前端請求錯誤」的意思;而看到 5xx 的值時,就也可以知道,這是表示出現了「後端處理有問題」的錯誤。
因此透過這個 Http Status Code,就可以快速的去知道,這一次 API 的請求結果為何了~
PS: 補充一下,其實 Http Status Code 有一個比較好記(但是也比較兇)的版本,這邊就也寫出來跟大家分享,但就…希望大家還是和平共處🤣,前端後端一家親的對吧!
這篇文章我們有去介紹了什麼是 Http Status Code,並且也有詳細的介紹了每一個大類中(ex: 1xx、2xx、3xx…),常見的 Http Status Code 有哪些。
如果你對後端技術有興趣的話,也歡迎免費訂閱 《古古的後端筆記》電子報 ,每週二為你送上一篇後端技術分享,那我們就下一篇文章見啦!