簡體   English   中英

如何正確設計一個restful API來使緩存失效?

[英]How to proper design a restful API to invalidate a cache?

我有一個應用程序需要來自Service2的數據,它將永遠返回給定請求的相同答案,除非它的后備數據庫被更新。 數據庫很少更新,讓我們說每年兩次。

我想設計一個解決方案,以便應用程序緩存來自Service2的答案,但是從外部提供一個功能,以便使Application的緩存無效。 我想過從應用程序中暴露一個RESTful Web服務,但我對如何正確設計它感到困惑。

/application/cache/invalidate是一個非RESTful URL - 我在考慮使用HTTP POST調用/application/cache/ 但是,在我看來,對於正確的RESTful設計,當POST用於更新資源時,要更新的內容應該包含在請求的主體中。

設計“InvalidateCache”restful webservice的正確方法是什么?

考慮使用DELETE而不是POST和url:

/application/cache/ 

在REST中, PUTDELETE都被認為是無效的操作。 也就是說,它們可以使用相同的結果資源狀態重復多次。 在這種情況下,您的緩存是資源,多個DELETE將導致相同的狀態,即清除緩存。

您可以考慮在您的URL中添加一個描述符,以闡明您正在清除緩存的內容而不是刪除緩存對象本身。 就像是

/application/cache/contents

或許,但這取決於你。 如果需要,走這條路線還可能讓您有選擇地從緩存中刪除。

這可能不會直接回答您的問題,但您可能還需要查看HTTP ETag ,它非常適合RESTful設計中的緩存。

我們的想法是應用程序將從Service2獲取資源,該資源將返回資源以及ETag標頭(它可能是最后修改的時間戳或散列)。 然后,應用程序將該資源與ETag一起緩存。

當Application需要再次使用該資源時,它可以使用緩存中的ETag頭向Service2發送HTTP GET。

  • 如果Service2發現資源自第一次返回到應用程序后未被更改,則返回HTTP狀態304(未修改)的空響應,指示Application可以使用緩存中的數據。
  • 如果數據已更新,則Service2將返回具有新ETag標頭(和HTTP狀態200)的新資源。

如果您不介意HTTP GET以查看資源是否更改以及Service2是否可以輕松確定資源是否已更改(無需加載),則此方法很有效。

優點是Service2不必使其客戶端(應用程序)的緩存無效,這可能不是一個很好的做法(如果你有很多客戶端可能很難)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM