gpt4 book ai didi

重试相同请求的 HTTP 状态码

转载 作者:可可西里 更新时间:2023-11-01 15:05:05 26 4
gpt4 key购买 nike

是否有 HTTP 状态代码指示客户端再次执行相同的请求?

我遇到这样一种情况,服务器在处理请求时必须“等待”锁消失。但是当锁消失时,请求可能接近其超时限制。因此,一旦锁被清除,我想指示客户端再次执行相同的请求。

我想出的最好办法是将 HTTP 307 发送到同一位置,但我担心某些浏览器可能不会接受这个(重定向循环检测)。

最佳答案

当服务器无法处理请求时,正确的响应是503 Service Unavailable .当条件是暂时的时,就像您的情况一样,您可以设置 Retry-After header 让客户端知道在重试之前应该等待多长时间。

但是,这不会强制浏览器再次执行请求 - 这是您需要在 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 header ,其中以秒为单位指定重试延迟。如果您想支持需要更多工作的日期。在生产代码中,我还建议使用某种计数器,以确保您不会永远重试。

至于使用 307 状态代码自动重复请求,我认为这不是一个好主意。即使您添加重试参数来绕过浏览器循环检测(这感觉就像一个可怕的 hack),它仍然无法处理 POST 请求。来自 RFC2616 :

If the 307 status code is received in response to a request other than GET or HEAD, the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user.

虽然众所周知某些浏览器会忽略此要求,但这绝对是不正确的,您也不想依赖它。

如果您没有使用 POST 请求,您几乎可以肯定应该使用。请记住 GET 请求 should not have any side effects ,默认情况下响应将被缓存。从您对问题的描述来看,您的请求很可能是在做一些有副作用的事情。

关于重试相同请求的 HTTP 状态码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17862015/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com