14

我们使用 Spring 来实现 REST 控制器,例如:

@Controller
@RequestMapping("/myservice") 
public class MyController {
    @RequestMapping(value = "foo", method = RequestMethod.GET)
    public @ResponseBody string foo() {...}
}

我可以使用 spring RestTemplate 调用此服务,它工作正常,但我更愿意使用代理调用它,而不是使用字符串 url 进行无类型调用:

// client code:
MyController proxy = getProxy("baseUrl", MyController.class);
String results = proxy.foo();

因此,代理生成的输入是带有描述 REST 详细信息的注释的 java 接口。我阅读了这篇文章,看起来所有类型的远程调用都具有代理,而我需要的 REST 就是类似RestProxyFactoryBean的,它将采用我的 REST java 接口并返回使用 RestTemplate 作为实现的类型安全代理。

我找到的最接近的解决方案是JBoss RESTEasy

但它似乎使用了不同的注释集,所以我不确定它是否适用于我已经拥有的注释:@Controller, @RequestMapping. 是否有其他选择,或者 RESTEasy 是唯一的选择?请注意,我是春季新手,所以一些明显的春季事物对我来说很新。

谢谢你。
迪玛

4

6 回答 6

3

你可以试试Netflix 的Feign,一个轻量级的基于代理的 REST 客户端。它通过注释以声明方式工作,并被 Spring Cloud 项目用于与 Netflix Eureka 交互。

于 2016-02-18T17:58:16.307 回答
1

发明 REST 范式的原因之一是因为对其他远程处理技术(RMI、CORBA、SOAP)的经验告诉我们,基于代理的方法通常会产生比它解决的问题更多的问题。

从理论上讲,代理使函数调用对其用户是远程透明的这一事实,因此他们可以像使用本地函数调用一样使用该函数。

然而,在实践中,这个承诺无法实现,因为远程函数调用只是具有本地调用之外的其他属性。网络中断、拥塞、超时、负载问题等等。如果您选择忽略所有这些远程调用可能出错的事情,您的代码可能不会很稳定。

TL;DR:您可能不应该使用代理,它不再是最先进的。只需使用RestTemplate.

于 2014-11-27T15:06:25.563 回答
1

Here is a project trying to generate runtime proxies from the controller annotations (using RestTemplate in the background to handle proxy calls): spring-rest-proxy-client Very early in implementation though.

于 2015-11-25T12:25:42.747 回答
1

这似乎可以做到:https ://swagger.io/swagger-codegen/ ,并且 swagger 为 REST API 提供了许多其他好东西。

于 2017-10-25T22:05:46.350 回答
0

我最终也为此建立了自己的图书馆。我想要一些尽可能小的东西,只将自己添加到类路径中并且没有传递依赖。

客户端创建如下:

final StoreApi storeApi = SpringRestTemplateClientBuilder
  .create(StoreApi.class)
  .setRestTemplate(restTemplate)
  .setUrl(this.getMockUrl())
  .build();

调用方法时将执行休息请求:

storeApi.deleteOrder(1234L);

is 支持两种方法签名:

  • ResponseEntity<X> deleteOrder(Long)
  • X deleteOrder(Long)
于 2021-11-06T20:03:52.783 回答
0

看看https://github.com/ggeorgovassilis/spring-rest-invoker。您只需要注册 FactoryBean:

@Configuration
public class MyConfiguration {

    @Bean
    SpringRestInvokerProxyFactoryBean BankService() {
        SpringRestInvokerProxyFactoryBean proxyFactory = new SpringRestInvokerProxyFactoryBean();
        proxyFactory.setBaseUrl("http://localhost/bankservice");
        proxyFactory.setRemoteServiceInterfaceClass(BankService.class);
        return proxyFactory;
    }

之后你可以自动装配接口类:

@Autowired
BookService bookService;
于 2019-03-17T22:41:46.557 回答