【问题标题】:What should be the API Response for already performed or unneeded operations已经执行或不需要的操作的 API 响应应该是什么
【发布时间】:2017-06-11 11:47:56
【问题描述】:
当我的 JsonAPI 被请求执行一些已经完成或没有意义的操作时,我应该返回什么响应(代码 + 内容)?
示例:假设我想请求发表文章。文章草稿通过特定端点更新(此处无关),并且有特定端点可供发布(我们感兴趣的响应)
4 种不同的场景,我需要弄清楚每次发送什么类型的响应:
从未请求发布,并且该文章具有所有发布强制信息,请求发布是有意义的,因此我将返回一个 202 接受的响应,其中包含“发布请求在”属性的文章资源
已发送/确认成功的发布发布请求,在此期间没有人有时间查看它。我应该返回什么?
之前的发布请求已被某人审核并接受(文章现已发布)。 API再次收到一篇已经发布的文章的发布请求,没有意义,应该返回什么?
文章未填写所有必填信息,有人提出发布请求。我必须通知用户他的请求因为错误没有被批准。我在想这个我可以返回验证错误列表。听起来公平吗?
【问题讨论】:
标签:
rest
api
json-api
http-response-codes
jsonapi-resources
【解决方案1】:
你的前两个子弹...
- 从未请求发布,并且文章包含所有发布强制信息,请求发布是有意义的,因此我返回 202 接受的响应,其中包含“发布请求在”属性的文章资源
- 已发送/确认一个成功的发布发布请求,在此期间没有人有时间对其进行审核。我应该返回什么?
...符合 202 Accepted:
202 Accepted:请求已被接受处理,但处理尚未完成。该请求最终可能会或可能不会被执行,并且可能会在处理发生时被拒绝。
你的第三个子弹:
- 以前的发布请求已被某人审核并接受(文章现已发布)。 API再次收到一篇已经发布的文章的发布请求,没有意义,应该返回什么?
我可能会在这里使用 303 重定向:
303 查看其他: 可以使用 GET 方法在另一个 URI 下找到对请求的响应。当收到响应 POST(或 PUT/DELETE)时,客户端应假定服务器已收到数据,并应使用单独的 GET 消息发出重定向。
但您也可以考虑使用 308 永久重定向:
308 永久重定向 (RFC 7538): 应使用另一个 URI 重复请求和所有未来请求。 307 和 308 与 302 和 301 的行为平行,但不允许更改 HTTP 方法。因此,例如,将表单提交到永久重定向的资源可能会顺利进行。
但我倾向于 303。
最后一个子弹:
- 文章未填写所有必填信息,有人提出发布请求。我必须通知用户他的请求因为错误没有被批准。我在想这个我可以返回验证错误列表。听起来公平吗?
这是一个带有错误的标准“错误客户端请求”(4xx):
400 Bad Request:由于明显的客户端错误(例如,格式错误的请求语法、太大、无效的请求消息帧或欺骗性请求路由),服务器无法或不会处理请求.
请确保在枚举响应中的错误时不暴露服务的实现细节。
记住:
-
2xx 响应表示成功
-
3xx 响应表示重定向
-
4xx 响应表明客户端失败
-
5xx 响应表示服务请求的应用程序失败
来源:List of HTTP status codes