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

ACs*_*ACs 3 rest http-status-codes

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

Nic*_*tel 9

我想你应该在这里使用403 Forbidden.

HTTP规范:

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

由于您拒绝更改"country"的值,因此这是您要返回的状态代码.该客户端未授权的改变资源的国家.

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

由于与资源的当前状态冲突,无法完成请求.此代码仅在预期用户可能能够解决冲突并重新提交请求的情况下才允许.响应主体应该包含足够的信息供用户识别冲突的来源.理想情况下,响应实体将包含足够的信息供用户或用户代理解决问题; 但是,这可能是不可能的,也不是必需的.

冲突最有可能发生在响应PUT请求时.例如,如果正在使用版本控制并且包含PUT的实体更改为与早期(第三方)请求所产生的资源冲突的资源,则服务器可能会使用409响应来指示它无法完成请求.在这种情况下,响应实体可能包含由响应Content-Type定义的格式的两个版本之间的差异列表.

(强调我的)


Dav*_*yon 6

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

至于409 Conflict,我通常在请求有效的情况下使用它,但是状态更改在某种程度上是非法的。但是,我也看到它也用于其他情况。

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