是否存在指示客戶端再次執行相同請求的HTTP狀態碼?重新發送相同請求的HTTP狀態碼
我面臨的情況是服務器在處理請求時必須「等待」鎖消失。但在鎖消失的時候,請求可能接近其超時限制。相反,一旦鎖清除,我想指示客戶再次執行相同的請求。
最好的我想出了一個HTTP 307到相同的位置,但我擔心一些瀏覽器可能不會購買到(重定向循環檢測)。
是否存在指示客戶端再次執行相同請求的HTTP狀態碼?重新發送相同請求的HTTP狀態碼
我面臨的情況是服務器在處理請求時必須「等待」鎖消失。但在鎖消失的時候,請求可能接近其超時限制。相反,一旦鎖清除,我想指示客戶再次執行相同的請求。
最好的我想出了一個HTTP 307到相同的位置,但我擔心一些瀏覽器可能不會購買到(重定向循環檢測)。
正確當服務器無法處理請求時,響應爲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,默認情況下,響應將被緩存。從你的問題描述來看,這聽起來很像你的請求可能會做一些有副作用的事情。
我不認爲服務器錯誤是一個正確的答案。對我來說,4xx範圍內的東西會更有意義。我閱讀http://stackoverflow.com/q/9794696/520567 - 那裏423是一個很好的ops用例。 202也適用於其他用例。 – akostadinov
使用307重定向,但增加了一個重試計數器:
http://path/to/server?retry=3
這將使得不同的網址上的每個重試,防止環路檢測。服務器可以檢查重試達到極限,並在發生錯誤時終止,因此用戶不會永遠等待。
添加一個不斷變化的URL參數,所以它看起來不像一個循環。 – Barmar
http://stackoverflow.com/q/9794696/520567(202和423)的好答案 – akostadinov