rest原則 - rest跟restful




什麼是監視REST資源以進行更改的RESTful方法? (2)

如果您的目標客戶端是Web瀏覽器,我建議使用404,因為保持連接打開可以主動阻止客戶端中的瀏覽器請求到同一個域。 由客戶決定投票的頻率。

如果有一個REST資源我想要監視來自其他客戶端的更改或修改,那麼最好的(也是最RESTful)方式是什麼?

我這樣做的一個想法是提供特定的資源來保持連接打開,而不是在資源不存在的情況下立即返回。 例如,給定資源:

/game/17/playerToMove

這個資源上的“GET”可能會告訴我輪到我的對手了。 我可能會注意到移動號碼(比如5)並試圖檢索下一步行動,而不是不斷地輪詢這個資源以找出輪到我移動的時間:

/game/17/move/5

在“正常”REST模型中,似乎對此URL的GET請求將返回404(未找到)錯誤。 但是,如果相反,服務器保持連接打開,直到我的對手發揮他的移動,即:

PUT /game/17/move/5

然後服務器可以將我的對手PUT的內容返回到該資源。 這將為我提供我需要的數據,以及一種通知我的對手何時移動而不需要輪詢。

這種方案是RESTful嗎? 或者它違反了某種REST原則?


您提出的解決方案聽起來像長輪詢 ,可以很好地工作。

您將請求/game/17/move/5並且服務器將不會發送任何數據,直到移動5完成。 如果連接斷開,或者您有超時,則只需重新連接,直到獲得有效響應。

這樣做的好處是它非常快 - 只要服務器有新數據,客戶端就會得到它。 它也可以恢復連接,並且可以在客戶端斷開一段時間後工作(你可以在移動後一小時請求/game/17/move/5並立即獲取數據,然後移動到move/6/等等)上)

長輪詢的問題是每個“輪詢”都會綁定一個服務器線程,這會快速破壞像Apache這樣的服務器(因為它耗盡了工作線程,因此無法接受其他請求)。 你需要一個專門的網絡服務器來提供長輪詢請求。 twisted的Python模塊(一個“事件驅動的網絡引擎”)非常適合這個,但它比常規輪詢更多的工作..

在回答你關於Jetty / Tomcat的評論時,我對Java沒有任何經驗,但似乎他們都使用類似的工作線程池系統到Apache,所以它會遇到同樣的問題。 我確實發現這篇文章似乎正好解決了這個問題(對於Tomcat)





polling