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;
}
产品实体的观看次数是 属性 还是 元数据?
如果观看次数是 属性,则考虑单独的 PUT
或 PATCH
请求来更新它。
A GET
是 safe method,不应更新所请求的资源。如果客户端预取 and/or 缓存那个本应安全的请求的结果,那么您的观看次数就会不正确。
要问自己的另一个问题是查看计数是否与该资源的 GET
请求同义。换句话说,您的应用可能出于用户视图以外的原因对资源执行 GET
。如果是这样,那将是在单独的非安全请求中增加观看次数的另一个原因。
如果视图计数确实是元数据并且 GET
确实等同于用户视图,那么我会继续增加 GET
上的计数器。一个单独的请求是有成本的,而且对于每个安全请求,服务器上可能会发生其他无害的副作用(例如日志记录)。
我需要跟踪实体视图计数.. 例如我有一个 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;
}
产品实体的观看次数是 属性 还是 元数据?
如果观看次数是 属性,则考虑单独的 PUT
或 PATCH
请求来更新它。
A GET
是 safe method,不应更新所请求的资源。如果客户端预取 and/or 缓存那个本应安全的请求的结果,那么您的观看次数就会不正确。
要问自己的另一个问题是查看计数是否与该资源的 GET
请求同义。换句话说,您的应用可能出于用户视图以外的原因对资源执行 GET
。如果是这样,那将是在单独的非安全请求中增加观看次数的另一个原因。
如果视图计数确实是元数据并且 GET
确实等同于用户视图,那么我会继续增加 GET
上的计数器。一个单独的请求是有成本的,而且对于每个安全请求,服务器上可能会发生其他无害的副作用(例如日志记录)。