对于已执行或不需要的操作,API响应应该是什么

时间:2017-06-11 11:47:57

标签: rest api json-api http-response-codes jsonapi-resources

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

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

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

  1. 从未请求过出版物,并且该文章包含所有出版物必填信息,请求发布是有意义的,因此我将返回202已接受的回复,其中包含“发布请求的属性”属性

  2. 已经发送/确认了成功的出版物发布请求,没有人有时间在其间进行审核。我该怎么回事?

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

  4. 该文章没有填写所有必填信息,有人提出了发布请求。我必须通知用户他的请求因错误而未被授予。我正在考虑这个我可以返回验证错误列表。听起来很公平吗?

1 个答案:

答案 0 :(得分:1)

你的前两颗子弹......

  • 从未要求过出版物,并且该文章包含所有出版物的强制性信息,请求发布是有意义的,因此我将返回202已接受的回复文章资源,包括""出版物要求在&#34 ;属性
  • 已经发送/确认了成功的出版物发布请求,没有人有时间在其间进行审核。我该怎么回事?

...可接受202接受:

  

202接受:已接受请求进行处理,但处理尚未完成。该请求最终可能会或可能不会被执行,并且在处理时可能会被禁止。

你的第三颗子弹:

  • 之前的发布请求已由某人审核并已接受(该文章现已发布)。 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