是否有HTTP状态代码指示客户端再次执行相同的请求?
我正面临服务器在处理请求时必须“等待”锁定消失的情况。但是当锁消失时,请求可能接近其超时限制。因此,一旦锁定清除,我想指示客户端再次执行相同的请求。
我想出的最好的是到相同位置的HTTP 307,但我担心某些浏览器可能不会购买(重定向循环检测)。
答案 0 :(得分:30)
当服务器无法处理请求时,正确的响应为503 Service Unavailable。当条件是临时的时,就像你的情况一样,你可以设置Retry-After
标题让客户知道在再次尝试之前它应该等待多长时间。
但是,这不会强制浏览器再次执行请求 - 这是您需要在javascript中自己处理的事情。例如,以下是如何在jquery中执行重试ajax POST请求的方法:
function postData() {
$.ajax({
type: 'POST',
url: '503.php',
success: function() {
/*
Do whatever you need to do here when successful.
*/
},
statusCode: {
503: function(jqXHR) {
var retryAfter = jqXHR.getResponseHeader('Retry-After');
retryAfter = parseInt(retryAfter, 10);
if (!retryAfter) retryAfter = 5;
setTimeout(postData, retryAfter * 1000);
}
}
});
}
请注意,上面的代码仅支持Retry-After
标头,其中重试延迟以秒为单位指定。如果您想支持需要更多工作的日期。在生产代码中,我还会推荐某种计数器,以确保您不会永远重试。
至于使用307状态代码自动重复请求,我认为这不是一个好主意。即使你添加一个重试参数来绕过浏览器循环检测(感觉就像一个可怕的黑客攻击),它仍然无法在POST请求上工作。来自RFC2616:
如果收到307状态代码以响应GET或HEAD以外的请求,则用户代理不得自动重定向请求,除非用户可以确认。
虽然已知某些浏览器会忽略此要求,但它绝对不正确,并且不是您想要依赖的东西。
如果您没有使用POST请求,那么您几乎可以肯定。请记住GET请求should not have any side effects,默认情况下会缓存响应。从您对问题的描述来看,这听起来非常像您的请求可能会做出有副作用的事情。
答案 1 :(得分:3)
使用307重定向,但添加重试计数器:
http://path/to/server?retry=3
这会在每次重试时使URL不同,从而阻止循环检测。并且服务器可以检查重试是否达到限制,并在发生这种情况时中止错误,因此用户不会永远等待。