2013-08-20 29 views
0

我有一個問題,如果有人可以給一個僞示例如何處理,我將不勝感激。你如何處理對資源的更改?

比方說,我的應用程序,您可以對

/clients/{clientId}/contactsSummary 
/locations/{locationId}/contactsSummary 

執行GET URL和我想做的事情兌現。現在如果我做POST/PATCH/DELETE

/contacts/{contactId} 

緩存如何失效。顯然,更改,創建或刪除聯繫人會導致前兩個URL返回緩存版本,這是不正確的。什麼是處理這個機制?

回答

0

如果前端需要絕對最新的信息,請不要緩存。否則,爲每個緩存項目添加一個到期時間,從檢索時間開始,這個時間可能從1秒到1小時(或更多)。

雖然您可能需要處理一致性問題。例如,您可能對過期的聯繫人有未過期的引用。

假設cache是從URL到元組(expires,data)的字典。檢索URL的僞代碼將爲:

cacheItem= cache[ULR] 
if(cacheItem == null || cacheItem.expires < currentTime) 
    cacheItem= (currentTime + 1_hour , http_get(URL)) 
    cache[ULR]= cacheItem 
return cacheItem.data 
0

客戶端決定是否要檢索資源的當前表示形式。使用所謂的「條件GET」。

如果請求消息包含If-Modified-Since,If-Unmodified-Since,If-Match,If-None-Match或If-Notify,則GET方法的語義變爲「條件GET」範圍標題字段。條件GET方法請求僅在條件標頭字段描述的情況下才能傳送實體。條件GET方法旨在通過允許緩存實體刷新而不需要多個請求或傳輸客戶端已經擁有的數據來減少不必要的網絡使用。

(科http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html 9.3)

這是如何工作的? C是客戶端,S是服務器。

Ç

GET /path/to/resource 

小號

200 OK 
ETag: foo 
Last-Modified: Tue, 15 Nov 1994 12:45:00 GMT 

Ç

客戶端PUT是個修改版本。

PUT /path/to/resource 
If-Match: foo 

小號

客戶有當前版本等等資源PUT是OK。

200 OK 
ETag: bar 
Last-Modified: Tue, 15 Nov 1994 12:46:00 GMT 

Ç

客戶PUT是個modiefied版本,但在此期間,資源已更改,並且ETag: bar不匹配任何更長的時間。

PUT /path/to/resource 
If-Match: bar 

小號

412 Precondition Failed 

Ç

客戶GET S中的當前版本的資源。

GET /PATH/to/resource 

小號

200 OK 
ETag: baz 
Last-Modified: Tue, 15 Nov 1994 12:47:00 GMT 

Ç

現在,客戶可以再次PUT資源。

PUT /path/to/resource 
If-Match: ba7 

小號

200 OK 
ETag: qux 
Last-Modified: Tue, 15 Nov 1994 12:48:00 GMT 
+0

感謝您的詳細回答,但實際上不是什麼,我是問。當我們談論一個URL時,這是有道理的,但在我的示例中,實體正在被修改,但是該實體的一些屬性用於在不同的URL上創建資源。那有意義嗎? – epitka