1

当我的 JsonAPI 被要求执行一些已经完成或没有意义的操作时,我应该返回什么响应(代码 + 内容)?

示例:假设我想请求发表文章。文章草稿通过特定端点更新(此处不相关),并且有特定端点用于发布(我们感兴趣的响应)

4种不同的场景,我需要弄清楚每次发送什么类型的响应:

  1. 从未请求发布,并且该文章具有所有发布强制信息,请求发布是有意义的,因此我将返回一个 202 接受的响应,其中包含“发布请求在”属性的文章资源

  2. 一个成功的发布发布请求已经发送/确认,并且没有人有时间在这之间进行审查。我应该返回什么?

  3. 以前的发布请求已被某人审核并接受(文章现已发布)。API再次接收到这篇文章的发布请求,已经发布了,没有意义,我应该返回什么?

  4. 文章未填写所有必填信息,有人提出发布请求。我必须通知用户他的请求由于错误而没有被批准。我在想这个我可以返回验证错误列表。听起来很公平 ?

4

1 回答 1

1

你的前两颗子弹...

  • 从未请求发布,并且该文章具有所有发布强制信息,请求发布是有意义的,因此我将返回一个 202 接受的响应,其中包含“发布请求在”属性的文章资源
  • 一个成功的发布发布请求已经发送/确认,并且没有人有时间在这之间进行审查。我应该返回什么?

...符合 202 接受:

202 Accepted:请求已被接受处理,但处理尚未完成。该请求最终可能会或可能不会被执行,并且在处理发生时可能会被拒绝。

你的第三个子弹:

  • 以前的发布请求已被某人审核并接受(文章现已发布)。API再次接收到这篇文章的发布请求,已经发布了,没有意义,我应该返回什么?

我可能会在这里使用 303 重定向:

303 See other:可以使用 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响应表示服务请求的应用程序部分失败

来源:HTTP 状态码列表

于 2017-06-11T23:09:44.347 回答