我有一个REST端点接受POST请求以将代码标记为已兑换。代码只能在特定日期之间兑换。
如果有人试图提早兑换代码,我应该如何回应?
我怀疑HTTP 403,Forbidden,是正确的选择,但是然后w3c声明“the request SHOULD NOT be repeated”,而在这种情况下我会预期请求会在稍后重复。
答案 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。