2013-02-12 45 views
17

當服務器返回異步請求的202 - Accepted狀態碼時,給出請求完成的估計值的適當方式是什麼?HTTP狀態202 - 如何提供關於異步請求完成的信息?

HTTP spec(由我加入斜體):

202接受

的請求已被接受處理,但是處理尚未完成。 [...]

實體與該響應中返回應包括請求的當前狀態的指示和任一個指向狀態監視器或當用戶可以期望該請求被滿足的一些估計。

這裏有一些想法:

  • 我已經在max-age指令掃了一眼,但使用它會被濫用Cache-Control
  • 在響應主體中返回預期的等待時間?
  • 添加應用程序特定的X-響應標題,但X-標題已在RFC 6648中棄用?
  • 添加(非X-)特定響應標頭?如果是這樣,它應該如何命名? SO問題Custom HTTP headers : naming conventions提供了一些想法,但在棄用之後,它僅回答HTTP頭的格式化方式,而不是如何命名。
  • 其他建議?

回答

5

儘管未明確提及202 - Accepted響應代碼,但Retry-After標題似乎是一個合適的選項。從documentation

可以使用Retry-After響應頭字段[...]以指示預計請求客戶端無法使用該服務的時間。

+1

鑑於該值應該是「秒整數(以十進制)「,如果我們想要一個更好的解決方案,將一個」X-Retry-After「標頭的值設置爲例如毫秒更合適嗎? – 2016-11-09 16:39:58

+0

@JosipRodin我建議使用'Retry-After:0'而不是發明一個自定義標題,因爲當客戶端得到響應時,幾毫秒就會過去,他們可以馬上重試。在異步操作的情況下,'Retry-After:0'好像在說「結果還沒有準備好,但隨時可以再次詢問(只要你願意)」。 – Gili 2017-04-19 04:56:13

+0

@吉利,但如果我不想讓他們隨時詢問他們會怎麼辦?例如,如果大部分客戶端都是150毫秒,那麼每秒6個請求,我可能有每秒只有2個請求的想法。 – 2017-04-19 08:39:24

8

絕對不要濫用現有的HTTP標頭。由於它是您自己的服務器,因此您可以定義響應的外觀。您可以(也應該)選擇最適合此信息收件人的任何迴應,並在回覆主體中返回實際信息。

例如,如果您只對顯示人類可讀的消息感興趣,則可以返回text/plain說「您的請求可能會在未來30分鐘內處理」。

在光譜的另一端,你可能想要去所有的REST方式,並返回application/json,或許此格式(我完全當場做這件事):

{ 
    "status": "pending", 
    "completion": { 
    "estimate": "Thu Sep 08 2011 12:00:00 GMT-0400", 
    "rejected-after": "Fri Sep 09 2011 12:00:00 GMT-0400", 
    }, 
    "tracking": { 
    "url": "http://server/status?id=myUniqueId" 
    } 
} 
9

您可以使用標頭Location指定狀態監視器的URL。諸如當前狀態和估算值之類的東西可以放在自定義頭文件中(除了自己的軟件可以使用的頭文件),還可以放在響應正文中(Web瀏覽器至少會向用戶顯示)。

+0

謝謝,我忘了'Location'頭。很可能,我們將使用自定義響應主體。 – matsev 2013-02-14 07:42:56

+0

碰巧,實際上不能在PHP中使用帶有HTTP 202的'Location'頭文件,因爲它按照RFC 2616執行特殊的語義,參見參考資料。 http://php.net/manual/en/function.header.php「第二種特殊情況是」Location:「標題,它不僅將該標題發送回瀏覽器,而且還返回一個REDIRECT(302 )狀態碼到瀏覽器,除非已經設置了201或3xx狀態碼。「 – 2017-05-03 13:33:34

+0

@JosipRodin RFC 2616在202(或任何其他響應)中不限制使用「位置」,它僅僅定義在201/3xx的情況下「位置」指的是什麼。所以這是一個PHP語義(或者錯誤,取決於你如何看待它),而不是HTTP語義。 – 2017-05-03 14:56:43