如何为Spring服务创建一个Java客户端?

6

我有一个使用Spring注解的服务定义。例如(源代码):

@RequestMapping(value = "/ex/foos/{id}", method = GET)
@ResponseBody
public String getFoosBySimplePathWithPathVariable(
  @PathVariable("id") long id) {
    return "Get a specific Foo with id=" + id;
}

问题在于Spring(或其他库)是否可以自动创建远程API的实现(客户端),而无需手动输入路径、方法类型、参数名称等(例如使用RestTemplate时需要)。以下是这样一个客户端的使用示例:
FooClient fooClient = new FooClient("http://localhost:8080");
String foo = fooClient.getFoosBySimplePathWithPathVariable(3l);

我该如何获取这样一个“生成”的客户端实现?

相关内容:https://stackoverflow.com/questions/47682312/how-to-create-a-client-for-a-spring-boot-service - AlikElzin-kilaka
关于Swagger呢?我阅读了有关Swagger的资料,但没有找到直接实现这个的方法。 - AlikElzin-kilaka
2个回答

1
你可能正在寻找Feign Client。它可以满足你的所有需求:通过HTTP调用一个服务就像调用Java接口的方法一样简单。但是为了让它正常工作,你需要使用Spring Cloud,标准的Spring框架还没有这个功能。

我注意到Feign使用不同于Spring(和JAS-RS)的注解:@RequestLine。我正在寻找一种机制来读取@RequestMapping和其他Spring注解。 - AlikElzin-kilaka
Feign客户端是Spring Cloud生态系统的一部分(可以视为“Spring”的一部分),也是生成代码的HTTP客户端包装器的最常用方式。请参阅官方Spring Cloud文档的7.1节:Feign可与现有的@RequestMapping控制器一起使用。 - Everv0id
尝试使用Feign(Api api = Feign.builder().target(Api.class, "http://localhost:8080"); api.getFoosBySimplePathWithPathVariable();)和以下定义:@RequestMapping(value="/whtever", method=RequestMethod.GET)。但是出现了Method ... not annotated with HTTP method type的错误:( 看来Feign对@RequestMapping不太友好 :( - AlikElzin-kilaka
1
你可以在这里查看(请参见StoreClient.java部分)使用Feign的经典方法是基于接口的。你不应该用@RequestMapping注释你的类方法,而是应该注释接口方法,然后构建http实现时,你只需要将整个接口注释为@FeignClient即可。 - Everv0id
我看到我们的大脑仍然在以往的方式思考事物。Feign非常棒。 - Nicholas DiPiazza

0

您可以使用Swagger Editor生成它。您只需定义资源的路径,然后它将为您生成几乎任何语言的客户端。


我该如何使用Swagger创建客户端代码? - AlikElzin-kilaka
一旦您在Swagger Editor中定义了端点结构并进入工具栏,您将看到一个名为“生成客户端”的菜单,选择所需的语言即可完成。 - TheOni
我没有在线编辑器。我只有服务器端注释,例如@RequestMapping(value = "/ex/foos/{id}", method = GET).... - AlikElzin-kilaka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接