2017-09-27 91 views
1

我需要跟蹤實體的觀看次數。例如我有一個Product實體,具有下列API端點:彈簧安置控制器軌跡實體查看次數

GET /products/{productID} 

在情況下,我想跟蹤的查看次數一個特定的Product我應該添加額外的邏輯,當我呼叫這個/products/{productID}端點時將增加查看計數?或者我應該爲此目的引入一個單獨的端點?

修訂

也許我不是清楚我的問題,但我的問題是用於更新與REST API櫃檯不是多層架構有關的最佳實踐。我想問以下 - 我應該更新計數器提到GET請求,或者我應該引入另一個API ..讓我們說POST /products/{productID}/viewings,然後在GET之後調用它以更新計數器?

+0

控制器處理Web的東西,服務實現業務邏輯,數據庫(dao)訪問數據庫。 – DwB

回答

1

是視圖指望產品實體財產還是

如果查看計數是屬性,則考慮單獨的PUTPATCH請求更新它。

A GETsafe method並且不應該更新被請求的資源。如果客戶端預取和/或緩存該安全請求的結果,那麼您的瀏覽次數就會不正確。

問自己的另一個問題是查看計數是否與該資源的GET請求同義。換句話說,除了用戶視圖以外,您的應用可能會對資源執行GET。如果是這樣,那將是另一個在單獨的非安全請求中增加查看次數的原因。

如果查看計數確實是元數據,並且GET確實等同於用戶視圖,那麼我會繼續增加GET上的計數器。單獨的請求會產生成本,並且每次安全請求都可能在服務器上發生其他無害的副作用(例如記錄)。

0

這對於AOP(面向方面​​編程)來說似乎是一個很好的場景,因爲這將允許您將此統計邏輯從業務邏輯中分離出來。

看看Spring doc瞭解更多關於AOP的信息以及如何通過Spring實現這一點。

然後,您可以在您的控制器上定義一個切入點,並擁有一個用於計數(並可能存儲)數據的服務。

0

至於如何開始使用SpringMVC中的RestController,以下是一個快速入門示例(使用products/{id}和JSON/XML req方法,JSON是直/ id並且XML是/id.xml)。

@RestController 
@RequestMapping("products") 
public class ProductsController { 

    @RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = "application/json") 
    public Product getProductInJSON(@PathVariable String id) { 

     //...Service/DAO fetch based on "id" 
     Product p = service.getProduct(id); 
     return p; 
    } 

    @RequestMapping(value = "/{id}.xml", method = RequestMethod.GET, produces = "application/xml")  
    public Product getProductInXML(@PathVariable String id) { 

     //...Service/DAO fetch based on "id" 
     Product p = service.getProduct(id); 
     return p; 

    } 
} 

關於點擊數,是的,我只想補充額外的邏輯控制器 - 可能比攔截清潔/簡單。

0

不要將計數放在控制器或AOP攔截器中;這兩個問題都是可怕的解決方案。

你應該有一個數據源來提供關於產品(可能是數據庫)的信息。 您應該使用JDBC包裝來訪問數據庫(也許是使用Hibernate或MyBatis編寫的DAO)。 您還應該擁有一個由控制器調用的用於檢索給定數據源的服務(如基因b的答案中所示)。

將訪問計數放入數據庫代碼(DAO)或服務中。

將計數存儲在數據庫中(也許創建一個AccessedProducts表)。

+0

感謝您的回答。也許我不清楚我的問題,但我的問題是有關使用REST API更新計數器的最佳做法,而不是關於多層體系結構。我想問以下問題 - 是否應該通過提到的GET請求來更新計數器,或者我應該引入另一個API ..讓我們說'POST/products/{productID}/viewings',然後在GET之後調用它。爲了更新櫃檯? – alexanoid

1

理想情況下,它應該是後續調用,因爲GET服務用於檢索值。既然你有更新的數,您可以使用相同的服務在POST幾乎相同的邏輯下面給出:

 @RequestMapping(value = "/product/{id}", method = { RequestMethod.GET, RequestMethod.POST }) 
     public Product getProduct(@PathVariable String id){ 
      //get and update product 
return product; 
    }