Web API为业务规则失败应返回什么http状态代码?

时间:2017-02-15 23:47:29

标签: api http asp.net-web-api

我对Web API中的客户资源进行了DELETE操作。 URI将类似于 / customer / 1000 / 。此操作将由系统在内部停用客户。

在某些情况下,由于客户欠公司付款,客户无法取消。

如果取消成功,则API返回200.如果由于待付款而取消,API应该返回什么?我可以返回200但消息对象作为带错误的响应吗?

2 个答案:

答案 0 :(得分:7)

如果您无法完成请求,则命令将返回适当的状态代码。由于客户端有故障并且可以纠正状态,因此4xx级代码似乎合适。来自RFC 7231, section 6.5

  

状态代码的4xx(客户端错误)类表示客户端似乎有错误。

我认为,有三个适用的代码:

400 / Bad Request

400在定义上有点宽泛,并且已经转变(至少这是我的印象)为全能状态。因此,如果您不确定,400几乎总是一个安全的赌注。

403 / Forbidden

此状态通常链接到HTTP身份验证框架。不公正的。来自RFC:

  

403(禁止)状态代码表示服务器理解请求但拒绝授权。

     

[...]可能会因与凭证无关的原因而禁止请求。

在这种情况下,这将有点延伸,但并非完全不合理。

409 / Conflict

  

409(冲突)状态代码表示由于与目标资源的当前状态冲突而无法完成请求。此代码用于用户可能能够解决冲突并重新提交请求的情况。

恕我直言,这是一个选择。 RFC提到PUT动词,但避免严格链接409。

答案 1 :(得分:-1)

技术上,是的。有关web api错误消息的真正好建议,请参阅此帖子Best practice to return errors in ASP.NET Web API

我倾向于避免为不成功的操作返回任何2XX,但这是个人偏好,因为这些事情没有明确的规则。我认为在某些情况下,最终用户可能会因为不成功而混淆。同样地,我避免使用5XX,因为这会给人一种内部错误的印象,或者他们应该重新提交。

这里有一个论坛帖子是相关的,并提出了一些好处:https://groups.google.com/forum/#!topic/api-craft/_dfnBKImNCI 在上面的帖子中建议使用带有自定义错误代码和消息的403是我在这种情况下建议的,因为它似乎是最接近的。

希望有所帮助:)