Java 可以在Spring引导应用程序中发现端点参数吗?

Java 可以在Spring引导应用程序中发现端点参数吗?,java,spring-boot,rest,microservices,service-discovery,Java,Spring Boot,Rest,Microservices,Service Discovery,我有一个Spring引导应用程序,它为REST请求公开了一些端点。我正在尝试解耦两个组件(它们目前直接调用彼此的代码),并希望它们相互发出REST请求(用于最终的微服务实现)。我知道端点发现可以通过发现服务(例如Eureka)完成,但是否有一种方法也可以将需要的服务中的参数信息传递给请求它的客户端? 我有一个购物车服务,它依赖于可供购买的产品信息。使用Eureka(或其他服务发现工具),我可以注册我的服务,以便购物车服务现在可以知道产品服务。如果产品服务具有以下内容: @GetMapping("

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

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

我知道要使用此端点获取ID为3的产品,cart服务必须向其发出请求,但有没有一种方法可以让它在运行时发现这些参数及其所需类型?在我的示例中,如果使用Eureka,购物车服务将动态地知道产品服务的位置,但不会知道其端点将接受的参数。我知道Spring Boot Actuator应该提供此信息,但每当我使用它时,我的端点的params字段总是空的。

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

@GetMapping("/product")
public Product findById(@RequestParam Map<String,String> allRequestParams) {
 return products.find(allRequestParams.get("id"));
}
@GetMapping(“/product”)
公共产品findById(@RequestParam-Map-allRequestParams){
return products.find(allRequestParams.get(“id”);
}

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

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

@GetMapping("/product")
public Product findById(@RequestParam Map<String,String> allRequestParams) {
 return products.find(allRequestParams.get("id"));
}
@GetMapping(“/product”)
公共产品findById(@RequestParam-Map-allRequestParams){
return products.find(allRequestParams.get(“id”);
}
您可以迭代参数映射以查找存在哪些参数

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

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

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

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

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

  • (超文本应用程序语言)-仍然是互联网草案
  • (用于链接数据的JSON)-W3C标准
Spring Boot支持HAL,请参阅

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

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

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

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

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

  • (超文本应用程序语言)-仍然是互联网草案
  • (用于链接数据的JSON)-W3C标准
Spring Boot具有HAL支持,请参阅。

您可以在产品服务中使用它来生成API,并在json文件中公开。例如,您可以查看带有its的示例项目,其中包含定义为的API和参数

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

您可以在产品服务中使用它生成api,并在json文件中公开。例如,您可以查看带有its的示例项目,其中包含定义为的API和参数


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

您可以使用swagger吗?@Vishrant swagger是否允许在应用程序级别公开信息?我曾在浏览器中使用它来测试我的API,但我从未在一个服务中使用它来获取另一个服务的信息。我不确定“应用程序级别”是什么意思,但你可以通过
Swagger
JSON
的形式公开你的API(然后你可以在你的应用程序中解析它),检查这个答案,
JSON
将通过此端点提供
http://:/v2/api docs
您可以使用swagger吗?@Vishrant是否允许在应用程序级别公开信息?我曾在浏览器中使用它来测试我的API,但我从未在一个服务中使用它来获取另一个服务的信息。我不确定“应用程序级别”是什么意思,但你可以通过
Swagger
JSON
的形式公开你的API(然后你可以在你的应用程序中解析它),检查这个答案,
JSON
将通过此端点提供
http://:/v2/api docs
参数映射从客户端传递到服务,不是吗?我想知道是否有可能让客户端发现服务端点有哪些可用参数?例如,在上面的示例中,/product端点需要传递一个ID参数。有没有办法让我的购物车