出于有效业务原因失败的有效请求的“正确”HTTP状态代码是什么?

时间:2015-11-02 19:19:56

标签: rest api-design

想要得到你的意见,可能没有一个绝对正确的答案,但我想看看你认为更正确的方法。

如果请求没有结构上的错误(格式正确)并且所有字段都有效(字段值不太长,必填字段有值等等)但是由于业务原因呼叫失败,例如“你不能改变未分配给你的任务的状态”,在这种情况下应该是什么响应:

  1. 200,带有解释错误的JSON:
  2. {
      error: {
        code :120,
        message: "you cannot change a status of a task that isn't assigned to you"
      }
    }
    
    1. 或者是类似机构的4xx回复:
    2. {
        error: {
          code :120,
          message: "you cannot change a status of a task that isn't assigned to you"
        }
      }
      

2 个答案:

答案 0 :(得分:4)

虽然我想同意@EJK,但他链接的规范已经过时了。

最新版本是RFC7231:http://tools.ietf.org/html/rfc7231#section-6.5.1,它改变了 403 FORBIDDEN响应状态的含义。

<强>答案:

因此,为了这个问题,400 BadRequest应该被使用,因为无论谁使用你的服务,案件是客户,都是错误的,并且可以修复他的请求

  

400(错误请求)状态代码表示服务器不能或      不会因为被认为是某些事情而处理请求      客户端错误(例如,格式错误的请求语法,无效请求      消息框架或欺骗性请求路由)。

来自您自己的用例的示例:

客户现在知道错误"you cannot change a status of a task that isn't assigned to you"是他自己的错。他甚至可能会尝试发出不同的新(有效)请求。

答案 1 :(得分:2)

403 Forbidden似乎是一场很好的比赛。

来自http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.4

  

服务器理解请求,但拒绝履行请求。   授权无效,请求不应重复。如果   请求方法不是HEAD,服务器希望公开   为什么请求没有得到满足,它应该描述原因   因为该实体的拒绝。如果服务器不想做   此信息可供客户使用,状态代码404(不是   找到了)可以代替使用。

因此,正如您所提议的那样,选项2似乎很好,因为它也描述了失败的原因。