记录一些 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阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • API定义规范 本规范设计基于如下使用场景: 请求频率不是非常高:如果产品的使用周期内请求频率非常高,建议使用双通...
    有涯逐无涯阅读 2,441评论 0 6
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,789评论 2 89
  • 一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式。”但是在要求详细讲述它所提出的各个约束,以及如...
    时待吾阅读 3,339评论 0 19
  • Flask之REST&API设计 一、REST(一种软件架构风格) 一)、问题 网络应用程序,分为前端和后端两个部...
    月亮是我踢弯得阅读 2,107评论 0 2
  • 2018/05/17农历四月初三,22年前的凌晨四点,用母亲的话说是天微微亮的时候,我的破壳之时。 天...
    We路一阅读 135评论 0 0