2013-07-25 64 views
20

是否存在指示客戶端再次執行相同請求的HTTP狀態碼?重新發送相同請求的HTTP狀態碼

我面臨的情況是服務器在處理請求時必須「等待」鎖消失。但在鎖消失的時候,請求可能接近其超時限制。相反,一旦鎖清除,我想指示客戶再次執行相同的請求。

最好的我想出了一個HTTP 307到相同的位置,但我擔心一些瀏覽器可能不會購買到(重定向循環檢測)。

+1

添加一個不斷變化的URL參數,所以它看起來不像一個循環。 – Barmar

+0

http://stackoverflow.com/q/9794696/520567(202和423)的好答案 – akostadinov

回答

24

正確當服務器無法處理請求時,響應爲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,默認情況下,響應將被緩存。從你的問題描述來看,這聽起來很像你的請求可能會做一些有副作用的事情。

+0

我不認爲服務器錯誤是一個正確的答案。對我來說,4xx範圍內的東西會更有意義。我閱讀http://stackoverflow.com/q/9794696/520567 - 那裏423是一個很好的ops用例。 202也適用於其他用例。 – akostadinov

3

使用307重定向,但增加了一個重試計數器:

http://path/to/server?retry=3 

這將使得不同的網址上的每個重試,防止環路檢測。服務器可以檢查重試達到極限,並在發生錯誤時終止,因此用戶不會永遠等待。

+0

我不認爲HTTP重定向允許修改參數嗎?請注意,307必須適用於任何方法。所以如果原始請求是一個帶有'form-data/multipart'的POST,我不認爲我可以添加'retry'參數? – Jeroen

+0

你可以重定向到任何URL,它可以包含參數,爲什麼它們不能和原始參數不同?但你說得對,這不適用於POST - 它不會將表單再次發佈到新的URL。 – Barmar