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

Rest 密码更新失败的最佳HTTP状态码错误是什么?,rest,api,http-status-codes,Rest,Api,Http Status Codes,我正在构建一些RESTAPI,以便在本机iOS/Android应用程序中使用。 其中一个端点允许用户通过提供两个字段来更新其密码:old\u password和password 在旧密码不正确的情况下,我应该使用哪个HTTP状态代码 我的第一个想法是一个401错误,但我已经在身份验证令牌无效时使用了它,它会自动触发应用程序中的注销 400似乎不合适,因为请求实际上在语义上是正确的,这是一个特定的身份验证错误。可能是422?需要记住的一件事是,状态代码和响应头一样,都是元数据;它们的存在使得那些对

我正在构建一些RESTAPI,以便在本机iOS/Android应用程序中使用。 其中一个端点允许用户通过提供两个字段来更新其密码:
old\u password
password

旧密码不正确的情况下,我应该使用哪个HTTP状态代码

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


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

需要记住的一件事是,状态代码和响应头一样,都是元数据;它们的存在使得那些对API的细节一无所知的通用组件可以智能地参与进来——例如,通过使缓存失效,或者抛出对话框来收集身份验证凭据

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

实际上,
400
通常可以;客户机应该像对待400一样对待4xx类状态代码。换句话说,您可以使用400,除非您特别希望通用组件产生不同的行为

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

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

409
422
之间的区别可能很有趣。解释这一区别

422:这可能包括试图以导致资源无效的方式修改资源 409:给定资源的状态,无法应用该请求

您还可以使整个4xx类响应代码不合适。例如,如果请求方法为,则服务器应

根据资源自身的特定语义处理请求中包含的表示

它做到了;甚至成功。它只是没有产生最普遍预期的成功结果

另一方面,JSON补丁会提出另一个方向;您更改密码的尝试可能看起来像

[
    { "op": "test", "path": "/password", "value": "old_password" },
    { "op": "replace", "path": "/password", "value": "new_password" }
]

如果您在
测试中提供了错误的密码
,则该操作将被视为不成功,这反过来意味着修补程序不成功。这反过来会调用中所述的错误处理参数。

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

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

实际上,
400
通常可以;客户机应该像对待400一样对待4xx类状态代码。换句话说,您可以使用400,除非您特别希望通用组件产生不同的行为

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

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

409
422
之间的区别可能很有趣。解释这一区别

422:这可能包括试图以导致资源无效的方式修改资源 409:给定资源的状态,无法应用该请求

您还可以使整个4xx类响应代码不合适。例如,如果请求方法为,则服务器应

根据资源自身的特定语义处理请求中包含的表示

它做到了;甚至成功。它只是没有产生最普遍预期的成功结果

另一方面,JSON补丁会提出另一个方向;您更改密码的尝试可能看起来像

[
    { "op": "test", "path": "/password", "value": "old_password" },
    { "op": "replace", "path": "/password", "value": "new_password" }
]
如果您在
测试中提供了错误的密码
,则该操作将被视为不成功,这反过来意味着修补程序不成功。这反过来将调用错误处理的参数,如中所述