關於 RESTful API 中 HTTP 狀態碼的定義
最近正好使用了一會兒 Koa ,在這說一下自己對各個 請求碼的見解和使用場景,懶人直接看 200、400、401、403、404、500 就可以了。
其中 2XX/3XX 其實都是請求成功,但是結果不同。4XX 是請求出錯,5XX 是伺服器處理出現錯誤。
200
這個最容易理解,就是正確的請求返回正確的結果,如果不想細分正確的請求結果都可以直接返回200。
201
表示資源被正確的建立。比如說,我們 POST 使用者名稱、密碼正確建立了一個使用者就可以返回 201。
202
請求是正確的,但是結果正在處理中,沒法返回對應的結果。比如說,我們請求一個需要大量計算的結果,但是並沒有計算結束時,可以返回這個,這時候客戶端可以通過輪詢等機制繼續請求。
203
請求的代理伺服器修改了源伺服器返回的 200 中的內容,一般用不到。比如說,我們通過代理伺服器向伺服器 A 請求使用者資訊,伺服器 A 正常響應,但代理伺服器命中了快取並返回了自己的快取內容,這時候它返回 203 告訴我們這部分資訊不一定是最新的,我們可以自行判斷並處理。
204
請求正確,但是沒有需要返回的內容。比如說,我們請求刪除某個使用者,刪除成功可以返回 204。
205
類似 204,但是要求請求者重置檢視,一般也用不到。比如說,我們請求刪除某個使用者,伺服器返回 205 的話,我們就重新整理現在的使用者列表。
206
請求成功,但根據請求頭只返回了部分內容。比如說,我們下載一部片,共有 10 部分,我們把請求也分成了 10 次(防止一次請求過大),這時候伺服器就可以返回 206 並在其頭部告訴我們這是哪一部分,然後再根據這個資訊進行拼裝。
300
請求成功,但結果有多種選擇。比如說,我們下載一部片,伺服器有 avi、mp4 等格式,這時候可以返回 300,並在 body 裡告知有哪些格式,然後使用者可以根據這些格式再次請求。
301
請求成功,但是資源被永久轉移。比如說,我們要下載葫蘆娃,但是由於舊的儲存服務商漲價了,現在要使用新的儲存服務了,要去新地址下載,這時候可以返回 301,並在 header 的 Location 中告知新的地址,以後也應當到這個地址下載。
302
請求成功,但是資源被臨時轉移了。和 301 不同的是,除非是 HEAD 請求,否則新地址的資訊應當在 body 中返回,並且資源只是臨時轉移,以後不應當通過新地址來下載。
303
類似 302,但要求使用 GET 來訪問新的地址來獲取資源。
304
請求的資源並沒有被修改過。比如說,我們傳送請求想看看 5.20 後的情侶資訊,伺服器查詢沒有新的情侶資訊產生,這時候可以返回 304,然後客戶端可以繼續用舊的資料。
305
請求的資源必須通過代理訪問。比如說,我們想請求伺服器 A 上新的 iPhone 的資訊,但是需要通過代理伺服器才能訪問,如果直接請求了伺服器 A,沒有經過代理伺服器,這時候伺服器 A 就可以返回 305 從而告訴我們應當訪問代理伺服器。
306
不用了。
307
類似 302,但要求使用原有的請求方式來通過新地址獲取資源。
308
類似 301,但要求使用原有的請求方式來通過新地址獲取資源。
400
請求出現錯誤,比如請求頭不對等,所有不想明確區分的客戶端請求出錯都可以返回 400。
401
沒有提供認證資訊。比如說,請求的時候沒有帶上 Token 等。
402
為將來的需要所保留的狀態碼。
403
請求的資源不允許訪問。比如說,你使用普通使用者的 Token 去請求管理員才能訪問的資源。
404
請求的內容不存在。
405
請求的方法不允許使用。比如說,伺服器只實現了 PATCH 了局部更新資源,並沒有實現 PUT 來替換資源,而我們使用了 PUT,這時候伺服器可以返回 405 來告知並沒有實現對 PUT 的相關處理。
406
請求的資源並不符合要求。比如說,我們 header 裡請求 JSON 格式的資料,但是伺服器只有 XML 格式的資料,這時候可以返回 406 告知。
407
類似 401,但是要求必須去同代理伺服器進行認證。
408
客戶端請求超時。我們想 POST 建立一個使用者,雖然建立了連線,但是網路不好,伺服器在規定時間內沒有得到我們的請求資訊,這時候伺服器可以返回 408 告訴我們超時了。然後我們可以重新發送請求。
409
請求衝突。比如說,伺服器要求不同使用者不能重名,伺服器已經有了一個名叫小偉的使用者,這時候我們又想建立一個名叫小偉的使用者,伺服器可以返回 409,告訴我們衝突了,也可以在 body 中明確告知是什麼衝突了。
410
請求資源曾經存在,但現在不存在了。比如說,我們下載葫蘆娃,但是因為版權被刪了,下載不了了,這時候伺服器返回 410,告訴我們洗洗早點睡。
411
沒有提供請求資源的長度。比如說,我們下載葫蘆娃,伺服器只允許我們分部分下載,我們如果不告訴伺服器我們要下載哪部分,伺服器就返回 411 警告我們。
412
請求的資源不符合請求頭中的 IF-* 的某些條件。比如說,我們下載葫蘆娃,然後在請求頭告知伺服器要 5.20 後更新過的,伺服器沒有,於是返回了 412。
413
請求體過大。比如說,伺服器要求上傳檔案不能超過 5M,但是我們 POST 了 10M,這時候就返回 413。
414
請求的 URI 太長了。比如說,我們提供了太多的 Query 引數,以至於超過了伺服器的限制,這時候可以返回 414。
415
不支援的媒體型別。比如說,我們上傳了一張七娃的 GIF 動圖,而伺服器只允許你上傳 PNG 圖片,這時候就返回 415。
416
請求的區間無效。比如說,我們分部分下載時請求葫蘆娃的 10 分鐘到 12 分鐘的內容,但是這部葫蘆娃只有 1 分鐘的內容,這時候就返回 416。
417
預期錯誤。指伺服器沒法滿足我們在請求頭裡的 Expect 相關的資訊。
418
我是個茶壺。這是一個愚人節的玩笑,這個狀態碼就是用來搞笑的。
500
伺服器錯誤。沒法明確定義的伺服器錯誤都可以返回這個。
501
請求還沒有被實現。比如說,我們請求一個介面來自動拒絕專案經理的要求,但是這個介面只是美好的想象,並沒有被實現,這時候可以返回 501。
502
閘道器錯誤。比如說,我們向伺服器 A 請求下載葫蘆娃,但是 A 其實只是一個代理伺服器,他得向 B 請求葫蘆娃,但是不知道為啥 B 不理他或者給他錯誤,這時候哦可以 A 返回 502 用來表示 B 這傢伙傲嬌了。
503
服務暫時不可用。比如說,伺服器正好在更新程式碼重啟。
504
類似 502,但是這時候是 B 不理 A,超時了 。
505
請求的 HTTP 版本不支援。比如說,現在強行根據 HTTP 1000 來請求。