【问题标题】:Should HTTP Header Status match Body Status for RESTful callsHTTP 标头状态是否应与 RESTful 调用的主体状态匹配
【发布时间】:2018-08-20 21:46:06
【问题描述】:
构建一个 RESTful Web 服务端点,并想知道 HTTP 标头状态与响应正文中的状态的最佳实践是什么。他们应该总是匹配,还是可以不同?例如,在出现错误请求的情况下,实际上是我们的应用程序层进行负载的解析和处理。因此,如果请求到达应用层,HTTP 标头是否应该显示 200(表示传输没有问题)而响应正文包含 400(表示错误请求)?或者他们应该总是匹配?标题和正文都是 400?
谢谢。
【问题讨论】:
标签:
rest
web-services
http
【解决方案1】:
一般来说,保持一致是一种很好的做法。因此,如果您打算在 JSON 正文中返回 HTTP 状态代码,它应该与 HTTP 状态代码相同。
如果您想添加有关您的应用程序错误的更多详细信息。 JSON-API standard 为 JSON 错误体定义了一些字段,例如:
-
code:特定于应用程序的错误代码,以字符串值表示。例如,您可以为 HTTP 400 状态代码设置不同的代码。
-
标题:对问题的简短、易读的摘要,不应随着问题的发生而变化,除非用于本地化目的。
-
详细信息:针对此问题发生的特定于人类可读的解释。与标题一样,该字段的值也可以本地化。
假设您的应用程序具有以下路径来获取属于艺术家(由 :artist_id 参数标识)的歌曲(由 :id 参数标识)的详细信息:
GET /artists/:artist_id/songs/:id
此请求可能会产生两个不同的 Not Found 错误:
- 找不到艺术家时
- 找不到歌曲时
对于这两种情况,您都将返回 HTTP 404 状态代码。但是,在您的 json 正文中,您可以添加更多详细信息:
- 当找不到艺术家时
- 代码:10
- 标题:未找到艺术家
- 详细信息:ID 为 #{artist_id} 的艺术家不存在
- 找不到歌曲时
- 代码:12
- 标题:未找到歌曲
- 详细信息:ID 为#{id} 的歌曲不存在#{artist.name}
我还建议你看看JSON-API standard 是如何定义 HTTP 错误代码的