2010-03-05 183 views
3

我有一個REST服務器和在移動設備上運行的客戶端應用程序。客戶端有一些數據,並希望從服務器獲取數據更新。我如何以一種RESTful方式執行此操作在單個交易中REST最佳實踐:將客戶端同步到服務器

假設客戶有以下三個項目:

widget id=1 timestamp=2010-03-05T08:00:00 
    doodad id=1 widget=1 timestamp=2010-03-05T08:10 
    doodad id=2 widget=1 timestamp=2010-03-05T08:20 
    widget id=2 timestamp=2010-03-05T09:00:00 
    doodad id=3 widget=2 timestamp=2010-03-05T08:10 

,並且服務器有

widget id=1 timestamp=2010-03-05T08:00:00 
    doodad id=1 widget=1 timestamp=2010-03-05T08:10 
    doodad id=2 widget=1 timestamp=2010-03-05T09:00 
    doodad id=4 widget=1 timestamp=2010-03-05T08:30 
    widget id=2 timestamp=2010-03-05T10:00:00 
    doodad id=3 widget=2 timestamp=2010-03-05T09:10 
    doodad id=5 widget=2 timestamp=2010-03-05T08:30 

服務器應該返回類似

doodad id=2 widget=1 timestamp=2010-03-05T09:00 
    doodad id=4 widget=1 timestamp=2010-03-05T08:30 
    widget id=2 timestamp=2010-03-05T10:00:00 
    doodad id=3 widget=2 timestamp=2010-03-05T09:10 
    doodad id=5 widget=2 timestamp=2010-03-05T08:30 

只包含更改的行。

客戶端想告訴服務器它有什麼,以便服務器可以發送更新。我不想多次連接到服務器,因爲移動連接不可靠,我不想冒險獲取部分數據。

如果我打算做多個連接,我可能會讓客戶端爲每個項目生成GET請求,它使用ID和時間戳,服務器可以沒有任何應答(304未修改)或更新後的值作爲適當。例如:「GET/widgets/{id}; timestamp = xxx」。

在一次交易中做同樣的事情的最佳方式是什麼?我可以做一些類似於「GET/changes」的事情嗎?身體的客戶端已經有了每行的類型(widget或doodad),id和timestamp值?我想我知道如何返回值(作爲一系列變化),但客戶如何要求他們?

謝謝,關於如何使用etags拉爾夫

+0

它實際上是304未修改即返回如果 - 無 - 匹配:頭 – 2010-03-05 14:47:19

+0

對不起。在看着Javadocs之後錯誤地打上了它。 – Ralph 2010-03-05 18:22:42

回答

0

查找,這種事情是他們所爲。對於少量數據,發送整個有效負載狀態的速度會更快,而不是對每個資源進行多次調用服務器。

+0

我在Bill Rickful的書RESTful Java中看到了ETags上的東西,但這是服務器聲明沒有變化的方式,不是客戶端要求的。我需要一種RESTful方式讓客戶詢問它已有的多個值,而不需要客戶詢問多個事務。 – Ralph 2010-03-05 15:09:23

+0

對於客戶端來說,您只需傳遞GET中的if-none-match頭。要在批處理中執行此操作,您必須將自己的處理程序與POST一起發送到該URL以及包含您要測試的所有資源ID的一些主體 – 2010-03-05 15:37:41

相關問題