我有一个REST端点接受POST请求作为赎回标记一个代码。 该代码只能在一定日期间进行兑换。
我应该如何应对,如果有人试图提前赎回的代码?
我怀疑HTTP 403,故宫,是正确的选择,但随后的W3C规定“ 的要求不应该被重复 ”,而在这种情况下,我会期待被反复要求,只是在以后的日子。
我有一个REST端点接受POST请求作为赎回标记一个代码。 该代码只能在一定日期间进行兑换。
我应该如何应对,如果有人试图提前赎回的代码?
我怀疑HTTP 403,故宫,是正确的选择,但随后的W3C规定“ 的要求不应该被重复 ”,而在这种情况下,我会期待被反复要求,只是在以后的日子。
409冲突
请求无法完成,因为与资源的当前状态的冲突。 其中,预计用户可能能够解决冲突并重新提交申请,那么这个代码仅在允许的情况下。 响应机构应包含足够的信息,用户识别冲突的根源。 理想情况下,响应实体将包括为用户或用户代理来解决这个问题的足够信息; 然而,这也许是不可能的,而不是必需的。
403禁止更有意义,如果他们试图赎回已兑换的优惠券,虽然410个飘接缝优雅在这种情况下也是如此。
404未找到并不理想,因为资源确实在事实上是存在的,但是你可以使用它,如果你不想指定与403的理由,或者如果你想隐藏出于安全原因,资源的存在。
如果你正在使用HATEOAS ,那么你也可以在通(这么说)只包含一首你的客户关闭redeem
的优惠券资源(通过检索超媒体控制GET
)时,优惠券可兑换; 虽然这并不会试图反正赎回,停止过分束缚的客户。
由于休息的网址应该代表的资源我会用404回复-未找到
资源是只有某些日期间,将等任何其他日期也没有找到。
编辑:多亏了一些很好的批评(见下文),我想包退这个答案。 它是基于理查森和Ruby的书面记录,这可以说是不与井网httpbis在403禁止写 。 (就个人而言,我现在正在学习对409汤姆在一个单独的答案解释。)
403禁止是最好的选择。 我举理查森和Ruby的REST Web服务逐行。 正如你所看到的,403是一个非常适合:
客户端的请求是正确形成,但服务器不希望执行它。
校验!
这不仅是不充分的凭证时:这将是一个401(“未授权”)。 这更像是一种资源,只在特定的时间访问,或者从某些IP地址。
校验!
403的响应意味着客户要求确实存在的资源。 由于与401(“未授权”),如果服务器不希望给了连这个信息,它可以躺下并发送404(“未找到”)来代替。
你在上面写道:“代码表示可用它去现场之前GETted。” 所以,你是不是想隐瞒什么。 所以,坚持使用403检查!
如果合式客户端的请求,为什么在4xx系列(客户端错误),而不是5XX系列(服务器端错误)此状态代码? 因为基于比其形式以外的请求的一些方面中,服务使它决定; 比方说,一天的时间提出请求。
校验! 形成了客户端的请求纠正,但它在特定的时间是不恰当的。
我们去了四为四强。 403码是一个胜利者。 没有其他的代码相匹配也是如此。
所有这一切说,一个普通的,非特异性的400不会是错误的,但不会被视为特定的或有用的。
另一份答复提出的409冲突的代码。 虽然值得考虑,它是不是好一个合适的。 这是为什么。 据理查森和Ruby的一次:
闻听此事[409]响应响应意味着你试图把服务器的资源投入是不可能的或不一致的状态。 当您尝试删除一个水桶,是不是空的亚马逊S3给出了这样的响应代码。
自称晋升之前,它是“活跃”不会“把服务器资源进入不一致的状态。” 这将打破一些业务规则 - 并导致作弊 - 但它不会引起我看到一个逻辑上的矛盾。
所以,无论你在问你的问题或不发作意识到,403是一个不错的选择。 :)
当它说,要求“不应重复”,它指的是,你应该发送给浏览器的消息。
它无关,与实际的请求是否被重复。 (用户将得到相同的403消息一遍又一遍,如果他/她真的很想这么做。)
这就是说,因为资源是可用404不适合这个任务 - 该代码是不可兑换/禁止赎回。 它实际上是有害的,因为它会告诉你可能在你的URL链接或服务器配置犯了一个错误的用户。
当然,这是假定在相应的日期返回一个200来代替。