1

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

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

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

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

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

谢谢!

编辑:

我找到了这个响应-> https://stackoverflow.com/a/3290369/1171280,其中 Piskvor 建议使用 409 状态和请求标头来解释它失败的原因和/或正文。哪一个?标题?身体?两个都?

你怎么看?

编辑2:

带有详细错误的 HTTP 状态 + 正文(甚至带有机器可解析代码)是可以的,Twitter 可以做到这一点(https://dev.twitter.com/docs/error-codes-responses)和 RESPECT :) 。但我仍然怀疑 403 vs 409 ......:S

4

4 回答 4

2

不要使用409。使用403

[409] 仅在预期用户可能能够解决冲突并重新提交请求的情况下才被允许。

这是一个本来应该没问题的请求,但有一个可以解决的问题。如果您编辑了文档和PUT修改过的文本,但其他人在您之前做了同样的事情,您应该有机会查看其他人的工作,以免意外撤消他们的所有工作。你会得到一个 409,这意味着,如果你想修改它,你应该发送你的修改,并说明你已经看到了其他人的最新版本——即你知道你在做什么。

没有办法“纠正”重复的注册尝试。避免冲突的唯一方法是使用不同的用户名进行注册,但这是非常不正确的。

我在想象一个POST请求,它接受用户名和电子邮件地址并创建一个专用于该新用户的新资源(现在应该用于验证),并在电子邮件中发送该资源的 URL。因此,您正在处理POST请求处理程序拒绝创建新资源的问题,原因是应用程序的业务模型特定的原因(而不是与 HTTP 相关的原因,如语法错误)。

没有比 403 更具体的状态码了。在这种情况下,您应该使用 HTTP 的词汇表进行交流是“不允许的”——使用 HTTP 之上的层来交流原因,例如礼貌的 HTML 页面或一个 JSON 对象,供客户端理解并呈现为礼貌的 HTML 页面。

于 2013-06-08T10:10:40.447 回答
2

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

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

HTTP 代码

403 - 服务器理解请求,但拒绝执行。授权将无济于事,并且不应重复请求。

409 - 由于与资源的当前状态冲突,请求无法完成。仅在预期用户可能能够解决冲突并重新提交请求的情况下才允许使用此代码。

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

于 2013-06-07T07:39:23.880 回答
2

HTTP 状态代码并不意味着“发明”。

409 CONFLICT对我来说听起来不错。如果您的客户需要知道,也可以在正文中包含详细信息。

于 2013-06-07T07:34:16.157 回答
0

409应该没问题;有关详细信息https://datatracker.ietf.org/doc/html/draft-nottingham-http-problem-04可能会感兴趣。

于 2013-06-07T07:48:23.533 回答