Jer*_*oen 27 rest redirect http http-status-codes
是否有HTTP状态代码来指示客户端再次执行相同的请求?
我面临的情况是服务器必须"等待"锁定在处理请求时消失.但是当锁消失时,请求可能接近其超时限制.因此,一旦锁定清除,我想指示客户端再次执行相同的请求.
我提出的最好的是到相同位置的HTTP 307,但我担心一些浏览器可能不会购买(重定向循环检测).
Jam*_*ess 32
的正确的响应,当服务器无法处理的请求时,是503服务不可用.当条件是临时的时,就像在您的情况下一样,您可以设置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);
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
请注意,上面的代码仅支持Retry-After
以秒为单位指定重试延迟的标头.如果您想支持需要更多工作的日期.在生产代码中,我还会推荐某种计数器,以确保您不会永远重试.
至于使用307状态代码自动重复请求,我认为这不是一个好主意.即使你添加一个重试参数来绕过浏览器循环检测(感觉就像一个可怕的黑客攻击),它仍然无法在POST请求上工作.来自RFC2616:
如果收到307状态代码以响应GET或HEAD以外的请求,则用户代理不得自动重定向请求,除非用户可以确认.
虽然已知某些浏览器会忽略此要求,但它绝对不正确,并且不是您想要依赖的东西.
如果您没有使用POST请求,那么您几乎肯定应该这样做.请记住,GET请求不应有任何副作用,默认情况下,响应将被缓存.从您对问题的描述来看,这听起来非常像您的请求可能会做一些有副作用的事情.
归档时间: |
|
查看次数: |
21752 次 |
最近记录: |