web-services - 不同冲突场景的 HTTP 状态

标签 web-services http rest

我正在为 Web 服务实现用户注册。

当有人想注册一个帐户时,我的 WS 会向他/她的邮件发送一个激活链接。在单击此链接之前,用户帐户不会被激活(但信息会保存在数据库中,因此资源存在)。

所以我的问题是,如果您尝试多次注册同一个邮件,您将得到一个 409 CONFLICT 代码。但是有两种情况:

  1. 用户帐户等待确认
  2. 用户已经注册并激活

我想知道什么是正确的方法。我应该“发明”一个 HTTP 状态 4XX 来区分它们,还是用带有信息的 JSON 发送 409?其他解决方案?

谢谢!

编辑:

我找到了这个回复 -> https://stackoverflow.com/a/3290369/1171280 Piskvor 建议使用 409 状态和请求 header 来解释失败和/或正文的原因。哪一个?标题? body ?两个都?

你怎么看?

编辑 2:

HTTP 状态 + 带有详细错误的主体(甚至带有机器可解析的代码)是可以的,Twitter 会这样做(https://dev.twitter.com/docs/error-codes-responses)并尊重 :)。但我仍然怀疑 403 与 409...:S

最佳答案

待处理帐户是一种特殊类型的用户帐户,因此我认为这两个帐户(已注册和待处理)在您的问题上下文中是相同的。在这两种情况下,您都应该返回 409。对于 REST API,两者都是相同的情况,因为该资源已存在于系统中。

关于您更新的问题,我建议使用正文 (JSON) 发送错误,而不是使用自定义 HTTP header 来解释调用失败的原因。原因是在正文中您可以有多个错误消息(每个错误消息作为一个单独的 JSON 对象/数组元素),而在 header 中您只能有一个(尽管您可以根据某些字符进行拆分)。另一个原因是您可以使用一种通用的错误处理方法,该方法在 JSON 中查找“错误”对象,而不是为每个失败场景查找不同的自定义 header 。

HTTP codes :

403 - The server understood the request, but is refusing to fulfill it. Authorization will not help and the request SHOULD NOT be repeated.

409 - The request could not be completed due to a conflict with the current state of the resource. This code is only allowed in situations where it is expected that the user might be able to resolve the conflict and resubmit the request.

我认为应该是 409,因为可以通过使用不同的电子邮件地址重新发出请求来解决冲突。

关于web-services - 不同冲突场景的 HTTP 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16978497/

相关文章:

java - 如何编写用于重试调用 Java webservice 的 java 客户端代码

api - 什么是 OAuth,它如何保护 REST API 调用?

node.js - 请求中没有发送 req.params

python - 测试 Django REST View 集的 POST 方法

asp.net - 如何从表单例份验证中排除 Web 服务

java - 基于 JBoss EJB 的 Web 服务日期格式

java - 如何修改出站 CXF 请求的原始 XML 消息?

javascript - Cypress 发出 POST 请求后超时

javascript - $http get 请求在 angularjs/ionic 中没有及时完成

java - 在java中恢复http文件下载