Spring Rest Controller 跟踪实体视图计数

Spring Rest Controller track entity view count

我需要跟踪实体视图计数.. 例如我有一个 Product 实体并且有以下 API 端点:

GET /products/{productID} 

如果我想跟踪特定 Product 的观看次数,我是否应该添加额外的逻辑来在我调用此 /products/{productID} 端点时增加观看次数?或者我应该为此引入一个单独的端点?

已更新

也许我的问题不清楚,但我的问题是关于使用 REST API 更新计数器的最佳实践,而不是关于多层架构。我想问以下问题 - 我应该通过提到的 GET 请求更新计数器还是应该引入另一个 API.. 让我们说 POST /products/{productID}/viewings 然后在 [=15] 之后调用它=] 为了更新计数器?

这似乎是 AOP(面向方面​​编程)的一个很好的方案,因为这将允许您将此统计逻辑与业务逻辑分开。

查看 Spring doc 了解有关 AOP 的更多信息以及如何使用 Spring 实现它。

然后您可以在您的控制器上定义一个切入点并提供一个服务来计算(然后可能存储)数据。

至于如何在 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;

    } 
}

关于观看次数,是的,我只想在控制器中添加额外的逻辑 - 可能 cleaner/simpler 而不是拦截器。

不要将计数放在控制器或 AOP 拦截器中;对于这个问题,两者都是糟糕的解决方案。

您应该有一个数据源来提供有关给定产品的信息(可能是数据库)。 您应该使用 JDBC 包装器来访问数据库(可能是使用 Hibernate 或 MyBatis 编写的 DAO)。 您还应该有一个由控制器调用的服务来检索给定的数据源(如基因 b 答案所示)。

将访问计数放入数据库代码 (DAO) 或服务中。

将计数存储在数据库中(也许创建一个 AccessedProducts table)。

理想情况下,它应该是后续调用,因为 GET 服务用于检索值。由于您在 POST 中具有几乎相同的逻辑来更新计数,因此您可以使用下面给出的相同服务:

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

产品实体的观看次数是 属性 还是 元数据

如果观看次数是 属性,则考虑单独的 PUTPATCH 请求来更新它。

A GETsafe method,不应更新所请求的资源。如果客户端预取 and/or 缓存那个本应安全的请求的结果,那么您的观看次数就会不正确。

要问自己的另一个问题是查看计数是否与该资源的 GET 请求同义。换句话说,您的应用可能出于用户视图以外的原因对资源执行 GET。如果是这样,那将是在单独的非安全请求中增加观看次数的另一个原因。

如果视图计数确实是元数据并且 GET 确实等同于用户视图,那么我会继续增加 GET 上的计数器。一个单独的请求是有成本的,而且对于每个安全请求,服务器上可能会发生其他无害的副作用(例如日志记录)。