密码更新失败的最佳HTTP状态代码错误是什么?

时间:2018-02-15 08:57:19

标签: rest api http-status-codes

我正在构建一些REST API,以便在原生iOS / Android应用中使用。 其中一个端点允许用户通过提供两个字段来更新其密码:old_passwordpassword

old_password不正确的情况下,我应该使用哪种HTTP状态代码?

我的第一个想法是401错误,但我已经在身份验证令牌无效时使用它,它会自动触发应用中的注销。

400似乎不合适,因为请求实际上在语义上是正确的,这是一个特定的身份验证错误。也许422

1 个答案:

答案 0 :(得分:3)

要记住的一件事是,状态代码(如响应标头)是元数据;它们就在那里,因此对API细节一无所知的通用组件可以智能地参与 - 例如,通过使缓存无效,或者抛出对话框来收集身份验证凭据。

  

400似乎不合适,因为请求实际上在语义上是正确的

在实践中,400通常很好;客户端应该处理unrecognized 4xx类状态代码,因为它们会处理400.换句话说,除非您特别想通过通用组件引发不同的行为,否则可以使用400。

对于您的具体情况,409 Conflict可能是最接近的匹配

  

409(冲突)状态代码表示由于与目标资源的当前状态冲突而无法完成请求。此代码用于用户可能能够解决冲突并重新提交请求的情况。服务器应该生成一个有效负载,其中包含足够的信息,供用户识别冲突源。

RFC 5789 suggests 409422之间可能有趣的区别。解释这种区别

  

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中所述。