我正在构建一些REST API,以便在原生iOS / Android应用中使用。
其中一个端点允许用户通过提供两个字段来更新其密码:old_password
和password
。
在old_password
不正确的情况下,我应该使用哪种HTTP状态代码?
我的第一个想法是401
错误,但我已经在身份验证令牌无效时使用它,它会自动触发应用中的注销。
400
似乎不合适,因为请求实际上在语义上是正确的,这是一个特定的身份验证错误。也许422
?
答案 0 :(得分:3)
要记住的一件事是,状态代码(如响应标头)是元数据;它们就在那里,因此对API细节一无所知的通用组件可以智能地参与 - 例如,通过使缓存无效,或者抛出对话框来收集身份验证凭据。
400似乎不合适,因为请求实际上在语义上是正确的
在实践中,400
通常很好;客户端应该处理unrecognized 4xx类状态代码,因为它们会处理400.换句话说,除非您特别想通过通用组件引发不同的行为,否则可以使用400。
对于您的具体情况,409 Conflict可能是最接近的匹配
409(冲突)状态代码表示由于与目标资源的当前状态冲突而无法完成请求。此代码用于用户可能能够解决冲突并重新提交请求的情况。服务器应该生成一个有效负载,其中包含足够的信息,供用户识别冲突源。
RFC 5789 suggests 409
和422
之间可能有趣的区别。解释这种区别
422:这可能包括尝试以导致资源变为无效的方式修改资源 409:在给定资源状态的情况下,不能应用请求。
您还可以a reasonable argument使整个4xx类响应代码不合适。例如,如果请求方法是POST,那么服务器应该
根据资源自身的特定语义
处理请求中包含的表示
它做了什么;成功,甚至。它只是没有产生最常见的预期成功结果。
另一方面,JSON补丁会争论另一个方向;您尝试更改密码可能看起来像
[
{ "op": "test", "path": "/password", "value": "old_password" },
{ "op": "replace", "path": "/password", "value": "new_password" }
]
如果您在test
中提供了错误的密码,那么该操作将被视为不成功,这反过来又意味着PATCH不成功。反过来,它会调用错误处理的参数,如HTTP Patch中所述。