REST API针对非法操作的最佳HTTP状态响应

时间:2014-07-04 09:20:07

标签: rest http-status-codes

我在PHP中创建REST API。当客户端可能尝试执行不可用的操作时。 (例如,它尝试更改不可通过的资源的属性...例如:尝试将" country"属性的值更改为" Julius Caesar")什么是HTTP我应该通过回复发回状态代码吗?我推测在403和409之间。 我不知道403 Forbidden是否仅与用户权限相关,还是我可以用于此目的? 在什么情况下我应该使用409 Confloct? 总结一下非法操作的正确HTTP响应状态是什么?

2 个答案:

答案 0 :(得分:9)

我认为你应该在这里使用 403 Forbidden

来自HTTP specification

  

服务器理解请求,但拒绝履行请求。   授权无效,请求不应重复。 (...)

由于您拒绝更改“country”的值,因此这是您要返回的状态代码。客户未经授权更改资源的国家/地区。

在这种情况下,

409 Conflict 是合适的。例如,当有人发送更新资源的请求时,将使用409状态,但是由于资源在此期间已被修改,因此它们的资源版本已过时。换句话说,客户端的数据与服务器上的数据之间存在冲突。这与允许更改资源的某些属性无关。

  

由于与当前的冲突,请求无法完成   资源的状态。此代码仅在以下情况下才允许使用   预计用户可能能够解决冲突   重新提交请求。响应机构应该包括足够的内容   用户识别冲突根源的信息。   理想情况下,响应实体将包含足够的信息   用户或用户代理来解决问题;但是,这可能不是   可能而且不是必需的。

     

最有可能发生冲突以响应PUT请求。 :用于   如果正在使用版本控制并且实体是PUT   包括对资源的更改与资产的更改   早期(第三方)请求,服务器可能会使用409响应   表示无法完成请求。在这种情况下,   响应实体可能包含两者之间的差异列表   这两个版本采用响应Content-Type定义的格式。

(强调我的)

答案 1 :(得分:5)

在这种情况下,我通常会选择400 Bad Request。我不确定更具体的400范围状态代码是否更适合,但是我不会使用403.对我来说,403是安全相关的,不应该用于请求有效负载验证错误。

对于409 Conflict,如果请求有效,我通常会使用它,但状态更改在某种程度上是非法的。但是,我已经看到它在其他环境中使用过。

最后,只要您在API中保持一致(并记录返回状态代码的含义),您就可以灵活地决定如何表达错误。