不同冲突场景的HTTP状态

时间:2013-06-07 07:26:13

标签: web-services http rest

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

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

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

  1. 确认后待审的用户帐户
  2. 用户已注册并已激活
  3. 我想知道什么是正确的方法。我应该“发明”HTTP状态4XX来区分它们,还是发送409带有信息的JSON?其他解决方案?

    THX!

    修改

    我找到了这个回复 - > 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 个答案:

答案 0 :(得分:2)

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

409 CONFLICT听起来不错。如果您的客户需要知道,那么在身体中包含细节也是可以的。

答案 1 :(得分:2)

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

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

HTTP codes

  

403 - 服务器理解请求,但拒绝履行请求。授权不会有帮助,请求也不应该   重复。

     

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

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

答案 2 :(得分:2)

请勿使用409。使用403

  

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

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

无法“纠正”冗余的注册尝试。避免冲突的唯一方法是使用不同的用户名注册,但这是非常不正确的。

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

没有比403更具体的状态代码。在这种情况下,您应该使用HTTP的词汇表进行通信是“不允许的” - 使用HTTP上的层来传达为什么< / em>,就像礼貌的HTML页面或JSON对象一样,客户端可以理解并呈现为礼貌的HTML页面。

答案 3 :(得分:0)

409应该没问题;详情http://tools.ietf.org/html/draft-nottingham-http-problem-04可能会引起关注。