资源的HTTP状态代码尚不可用

时间:2012-06-18 09:33:17

标签: http rest

我有一个REST端点接受POST请求以将代码标记为已兑换。代码只能在特定日期之间兑换。

如果有人试图提早兑换代码,我应该如何回应?

我怀疑HTTP 403,Forbidden,是正确的选择,但是然后w3c声明“the request SHOULD NOT be repeated”,而在这种情况下我会预期请求会在稍后重复。

4 个答案:

答案 0 :(得分:14)

  

<强> 409 Conflict

     

由于与当前的冲突,请求无法完成   资源的状态。此代码仅在以下情况下允许   预计用户可能能够解决冲突   重新提交请求。响应机构应该包括足够的内容   用户识别冲突根源的信息。   理想情况下,响应实体将包含足够的信息   用户或用户代理来解决问题;但是,这可能不是   可能而且不是必需的。

403 Forbidden如果他们试图兑换已经兑换的优惠券会更有意义,尽管在这种情况下410 Gone接缝也很优雅。

404 Not Found并不理想,因为资源确实存在,但如果您不想使用403指定原因或者如果要隐藏资源的存在,则可以使用它安全原因。

如果你正在使用HATEOAS,那么你也可以通过在优惠券资源中包含redeem超媒体控件(通过{{ 1}})优惠券可以兑换;虽然这不会阻止过度绑定的客户试图赎回它。

答案 1 :(得分:1)

由于Rest网址应代表资源,我会回复 404 - Not Found
该资源仅在某些日期之间可用,因此在任何其他日期都找不到。

答案 2 :(得分:1)

编辑:感谢一些好评(见下文),我想提醒一下这个答案。它基于Richardson&amp; Ruby的写作,可以说与httpbis writing on 403 Forbidden不能很好地融合。 (就个人而言,现在我正在向409学习,正如汤姆在一个单独的答案中解释的那样。)

403 Forbidden是最佳选择。我会逐行引用RESTful Web Services by Richardson & Ruby。正如您将看到的,403非常合适:

  

客户端的请求是正确形成的,但服务器不想执行它。

检查!

  

这不仅仅是证书不足的情况:那将是401(“未经授权”)。这更像是只能在特定时间或某些IP地址访问的资源。

检查!

  

403的响应意味着客户端请求了真正存在的资源。与401(“未授权”)一样,如果服务器不想发出这些信息,它可以撒谎并发送404(“未找到”)。

您在上面写道:“代码表示可以在它上线之前获得。”所以,你不是想隐藏任何东西。所以,坚持使用403.检查!

  

如果客户端的请求格式正确,为什么4xx系列中的状态代码(客户端错误)而不是5xx系列(服务器端错误)?因为服务是基于请求的某些方面而不是其形式做出的决定;比如,提出请求的时间。

检查!客户的请求已形成纠正,但在特定时间内不合适。

我们四人四人去了。 403代码是赢家。没有其他代码匹配。

所有这些都说明了,一个简单的,非特定的400不会错,但不会那么具体或有用。

另一个答案提出了409冲突代码。虽然值得考虑,但它并不适合。这就是原因。根据Richardson&amp; Ruby再次:

  

获取此[409]响应响应意味着您尝试将服务器资源置于不可能或不一致的状态。当您尝试删除非空的存储桶时,Amazon S3会提供此响应代码。

在“活动”之前声明促销不会“将服务器资源置于不一致状态”。它会打破一些商业规则 - 并导致作弊 - 但这不会导致我看到的逻辑矛盾。

所以,无论你是否在提出问题的过程中意识到这一点,403都是一个很好的选择。 :)

答案 3 :(得分:-1)

当它说“不应该重复”请求时,它指的是你应该发送给观众的消息。

与实际请求是否重复无关。 (如果他/她愿意,用户将一遍又一遍地收到相同的403消息。)

也就是说,404不适用于此,因为资源可用 - 只是代码不可兑换/禁止兑换。它实际上是有害的,因为它告诉用户您可能在URL链接或服务器配置中犯了错误。

当然,这假设在适当的日期你返回200。