http请求在何种情况下会返回409
http请求在“用户被认为能够解决冲突,并且会重新提交新的请求”或者“冲突通常发生于对PUT请求的处理中”的情况下会返回409。
http请求在何种情况下会返回409?
问题:
举个例子把,非广告
粉笔网,一个在线做题的题库网站
(每次选择一道题的答案会发送一个请求把题目id和useranswer提交到服务器)
提交试卷后,点击浏览器后退按钮,再做题时发送题目id和useranswer的请求会获得状态码409 conflict
很显然这是一种防止交卷后再做题的机制
想请问下是怎么实现的
让http自动的返回409
注:post请求我在chrome开发工具的http头信息可以看到Request Payload或者Form Data两种不同类型的数据给提交了
put我完全看不到,是隐藏在uri地址里了?
方法:
由于和被请求的资源的当前状态之间存在冲突,请求无法完成。这个代码只允许用在这样的情况下才能被使用:
用户被认为能够解决冲突,并且会重新提交新的请求。该响应应当包含足够的信息以便用户发现冲突的源头。
冲突通常发生于对PUT请求的处理中。
例如,在采用版本检查的环境下,某次PUT提交的对特定资源的修改请求所附带的版本信息与之前的某个(第三方)请求向冲突,那么此时服务器就应该返回一个409错误,告知用户请求无法完成。此时,响应实体中很可能会包含两个冲突版本之间的差异比较,以便用户重新提交归并以后的新版本。
所以,按你的回退之后,返回 409 ,个人感觉,本身应该是用得不太合理,如果这里用409的话,那么他就应该告诉你,有冲突,而且应该告诉你如何修改,但是我看现在那里面都没有给出修改意见,而且我想也肯定没有给你提供修改方法。
下面来说说实现,首先,得满足一种状态,即当某某发生的时候,我就发409:
if($someError) { header("HTTP/1.0 409 Conflict", true); }}
第二个参数用于表明,如果前面已经发送过 相同类型的header的,是否使用当前这个替换,默认为 true,但是如果你想让他们并存的话直接使用 false 即可。
<?php header('WWW-Authenticate: Negotiate'); header('WWW-Authenticate: NTLM', false); ?>
在HTTP中,PUT被定义为idempotent的方法,POST则不是,这是一个很重要的区别。
“Methods can also have the property of "idempotence" in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.”
上面的话就是说,如果一个方法重复执行多次,产生的效果是一样的,那就是idempotent的。
举一个简单的例子,假如有一个博客系统提供一个Web API,模式是这样http://superblogging/blogs/post/{blog-name},很简单,将{blog-name}替换为我们的blog名字,往这个URI发送一个HTTP PUT或者POST请求,HTTP的body部分就是博文,这是一个很简单的REST API例子。我们应该用PUT方法还是POST方法?取决于这个REST服务的行为是否是idempotent的,假如我们发送两个http://superblogging/blogs/post/Sample请求,服务器端是什么样的行为?如果产生了两个博客帖子,那就说明这个服务不是idempotent的,因为多次使用产生了副作用了嘛;如果后一个请求把第一个请求覆盖掉了,那这个服务就是idempotent的。前一种情况,应该使用POST方法,后一种情况,应该使用PUT方法。
也许你会觉得这个两个方法的差别没什么大不了的,用错了也不会有什么问题,但是你的服务一放到internet上,如果不遵从HTTP协议的规范,就可能给自己带来麻烦。比如,没准Google Crawler也会访问你的服务,如果让一个不是indempotent的服务可以用indempotent的方法访问,那么你服务器的状态可能就会被Crawler修改,这是不应该发生的。
国外文章摘录,具体忘记名称作者和url了~
更多相关技术知识,请访问PHP中文网!
上一篇: 实例讲解ASP实现抓取网上房产信息
下一篇: PHP 剔除局域网文件