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



我有一个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字段总是空的。

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

您在运行时真的需要这些信息吗?

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

但是,如果您真的想在运行时使用它,那么使用HATEOAS API可能会更好。HAEOAS(作为应用程序状态引擎的超媒体(意味着您的API是可导航的。这意味着客户可以按照提供的链接"抓取"你的API,就像人类浏览网站一样。它的用处有多大,取决于你想要达到的目标。

有两种流行的"解决方案":

  • HAL(超文本应用语言(-仍然是互联网草案
  • JSON-LD(用于链接数据的JSON(-W3C标准

Spring Boot支持HAL,请参阅Spring Boot starter hateoas。

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

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

您可以迭代参数映射来查找存在的参数。

您可以在产品服务中使用Swagger来生成在json文件中公开的api。例如,您可以查看暴露了json的示例项目petstore,其中包含带有定义的api和参数。

然后,在您的购物车服务中,您可以在运行时导航产品服务api,迭代特定的api参数。

最新更新