是否有可能在Spring Boot应用程序中发现端点参数?

问题描述 投票:0回答:2

我有一个Spring Boot应用程序,它公开了REST请求的一些端点。我正在尝试解耦两个组件(当前直接调用彼此的代码),并且希望它们彼此进行REST请求(最终实现微服务)。我知道可以通过发现服务(例如Eureka)来完成端点发现,但是是否有一种方法也可以将需要服务的参数信息传递给请求它的客户端呢?示例:我有一个购物车服务,该服务依赖于有关可购买产品的信息。使用Eureka(或其他服务发现工具),我可以注册我的服务,以便购物车服务现在知道该产品服务。如果产品服务具有以下内容:

@GetMapping("/product")
public Product findById(@RequestParam int id) {
  return products.find(id);
}

我知道要使用此端点来获取ID为3的产品,购物车服务将不得不向http://localhost:1234/product?id=3发出请求,但是有没有办法在运行时发现这些参数及其必需的类型?在我的示例中,如果我使用Eureka,则会动态使购物车服务知道产品服务的位置,但不会知道其端点将接受的参数。我知道应该由Spring Boot Actuator提供此信息,但是每当我使用它时,端点的params字段始终为空。

java spring-boot rest microservices service-discovery
2个回答
0
投票

您可以使用参数映射,它将使用所有使用的参数动态填充:

@GetMapping("/product")
public Product findById(@RequestParam Map<String,String> allRequestParams) {
 return products.find(allRequestParams.get("id"));
}

您可以迭代参数图以查找存在哪些参数。


0
投票

有没有一种方法可以在运行时发现这些参数及其所需的类型?

您在运行时是否真的需要此信息?

因为如果在开发时需要它会更简单。然后,您可以使用Swagger之类的东西,它将提供服务规范端点。它甚至可以为您的服务生成一个客户端。

但是,如果您确实希望在运行时使用它,则最好使用HATEOAS API。 HATEOAS(作为应用程序状态引擎的超媒体)意味着您的API是可导航的。这意味着客户可以按照显示的链接“爬网”您的API,就像人在浏览网站一样。它的有用程度取决于您要实现的目标。

有两种流行的“解决方案”:

  • [HAL(超文本应用语言)-仍是Internet草案
  • [JSON-LD(用于链接数据的JSON)-W3C标准]

Spring Boot具有HAL支持,请参见spring-boot-starter-hateoas

© www.soinside.com 2019 - 2024. All rights reserved.