記錄一些 REST API 的常用狀態碼

在最近的項目中,我發現不少人在設計 REST API 的時候,往往僅僅通過應用層的協議來返回調用的狀態,而忽略了 HTTP 狀態碼本身的含義。

本文參考 https://restfulapi.net/http-status-codes,我在這里做一個簡化版本,列出常見、但是往往會忽略使用的錯誤碼。

分類

分類 描述
1xx: Informational 用于協議握手階段的臨時應答
2xx: Success 客戶端的請求被成功地接收
3xx: Redirection 客戶端必須有一些附加的動作才能完成它們的請求
4xx: Client Error 此類錯誤應該由客戶端負責
5xx: Server Error 服務器對此類錯誤負責

201 Created

用于表明一個實體(Entity)被成功地創建了,例如: 創建訂單的 Endpoint POST /admin/orders,在成功創建后應該返回 201 Created

202 Accepted

假如電商的結賬過程需要異步完成。例如: 結賬操作需要異步調用貨運公司的 API 才能知道運費信息。因此就需要一種異步的流程來處理。

首先,客戶端先創建了一個結賬(Checkout),POST /admin/checkouts,新創建的 checkout 數據馬上會返回的,但是 shipping-rate 是空的。

HTTP/1.1 202 Accepted
Content-Type: application/json; charset=utf-8
Location: https://app.mystore.com/admin/checkouts/f9604c/
Retry-After: 1

{
    checkout: {
          "created_at":"2016-03-18T13:21:39-04:00",
          ...
          "shipping_rate":null,
          ...
    }
}

此時返回的狀態碼是 202 Accepted,表示數據不完整,可以后續通過“拉”操作來完成。Location 給出的是后續的“拉” API 的 Endpoint。

Retry-After 給出了“拉”的時間間隔,有兩種格式。上例中單位為 “秒”,也可以跟一個期待來拉的日期時間,格式參見 HTTP Date

連續“拉”的過程

當客戶端通過去拉:

GET  /admin/checkouts/f9604c/ HTTP/1.1
Host: app.mystore.com

但是仍然沒有獲得運費信息,那么返回內容為:

HTTP/1.1 202 ACCEPTED
Content-Type: application/json; charset=utf-8
Location: https: https://app.mystore.com/admin/checkouts/f9604c
Retry-After: 1

{
  "shipping_rates": []
}

如果某次“拉”發現運費信息已經得到,那么返回的狀態碼就是 200 Ok:

HTTP/1.1 200 OK
Location: https: https://app.mystore.com/admin/checkouts/f9604c
Retry-After: 1

{
  "shipping_rates": [
    {
      "price": 10.00,
      "title": "Ground",
      "phone_required": false,
      "delivery_range": []
    }
  ]
}

204 No Content

有時,PUTPOST 或者 DELETE 操作沒有任何需要返回的數據,則可以直接用 204 No Content,顯示地告訴客戶端沒有消息體。

303 See Other

303 See Other 可以被用于一個有趣的場景。例如,你需要一口氣建立一大批 checkouts。如果超過了 API 單位時間調用限制,那么則會返回 429 Too Many Requests。但是還有一種可能是,即使沒有超過調用限制,但是系統也可能將你的請求放入隊列慢慢處理,此時,你就會收到 303 See Other 返回狀態,以及 Location 頭告訴調用者應該通過那個 URL 進行后續的輪訓,使用流程類似 202 Accepted

400 Bad Request

如果其他 4xx 的狀態碼不適合表示出錯原因,那么用 400 Bad Request 兜底。

401 Unauthorized

加入客戶端訪問某個訂單數據,但是沒有在 HTTP Header 中附帶 User Token,那么就應該返回這個錯誤碼。用來告訴客戶端,它想訪問的資源是需要先進行用戶認證才能完成。

402 Payment Required

如果訪問的資源超期需要續費,則返回 402 Payment Required。例如: 用戶的店鋪超期未付費,那么訪問該店鋪所有相關的 API 都會返回這個狀態。

403 Forbidden

401 Unauthorized 不同,403 Forbidden 是在 User Token 存在,但是權限不足以獲取目標資源時返回。例如,你用 Alice 的 User Token 去訪問 Bob 的訂單。

404 Not Found

GET /admin/orders/{orderId},假如 orderId 對應的訂單不存在,那么我們應該顯示地返回 404 Not Found 作為狀態碼。

422 Unprocessable Entity (不能處理的實體)

一般發生在數據格式沒有問題,但是在數據的具體的“語義”驗證階段發現問題,則返回 422 Unprocessable Entity。 例如: 我們要創建一個訂單,但是 channel 屬性填寫了一個未知的值。此時我們應該返回 422 Unprocessable Entity 作為 HTTP 的狀態碼,然后在消息體的 code 或者 error 字段提供更精準的信息。

423 Locked

如果被訪問的資源被“鎖”住,禁止修改和刪除,可以返回此狀態碼。典型的例子是,訂單在發貨后可以被鎖住,避免不小心修改。

429 Too Many Requests

這個很多人都熟悉了,用于單位時間內 API 訪問次數超限。

501 Not Implemented

這個狀態碼往往用于今后會提供這個 API Endpoint 的有效實現,但是目前還沒有,先占個坑。如果客戶端不小心調了,就會返回 501 Not Implemented

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,197評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,415評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,104評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,884評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,647評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,130評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,208評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,366評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,887評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,737評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,478評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,174評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,586評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,827評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,608評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,914評論 2 372

推薦閱讀更多精彩內容

  • API定義規范 本規范設計基于如下使用場景: 請求頻率不是非常高:如果產品的使用周期內請求頻率非常高,建議使用雙通...
    有涯逐無涯閱讀 2,575評論 0 6
  • 關于Mongodb的全面總結 MongoDB的內部構造《MongoDB The Definitive Guide》...
    中v中閱讀 31,986評論 2 89
  • 一說到REST,我想大家的第一反應就是“啊,就是那種前后臺通信方式。”但是在要求詳細講述它所提出的各個約束,以及如...
    時待吾閱讀 3,444評論 0 19
  • Flask之REST&API設計 一、REST(一種軟件架構風格) 一)、問題 網絡應用程序,分為前端和后端兩個部...
    月亮是我踢彎得閱讀 2,210評論 0 2
  • 2018/05/17農歷四月初三,22年前的凌晨四點,用母親的話說是天微微亮的時候,我的破殼之時。 天...
    We路一閱讀 150評論 0 0