【问题标题】:What should be the API Response for already performed or unneeded operations已经执行或不需要的操作的 API 响应应该是什么
【发布时间】:2017-06-11 11:47:56
【问题描述】:

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

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

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

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

  2. 已发送/确认成功的发布发布请求,在此期间没有人有时间查看它。我应该返回什么?

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

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

【问题讨论】:

    标签: 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      • 2022-01-03
      • 1970-01-01
      • 2019-12-22
      相关资源
      最近更新 更多