Spring6提供的四种远程接口调用神器!你知道那种?

1. 介绍Spring 6是一个非常强大的框架,它提供了许多工具和接口来简化远程接口调用 。其中,WebClient、RestTemplate、HTTP Interface和RestClient是四种方式 。
WebClient是Spring 5中新引入的一个接口基于响应式,它提供了一种更简单、更灵活的方式来调用远程接口 。与RestTemplate相比,WebClient更加现代化,具有更好的性能和更低的内存占用 。
RestTemplate是Spring 3中引入的一个接口,它提供了一种更加简单、更加直观的方式来调用远程接口 。虽然WebClient是更现代化的选择,但RestTemplate仍然是一种常用的远程接口调用方式 。
HTTP Interface将 HTTP 服务定义为一个 JAVA 接口,其中包含用于 HTTP 交换的注解方法 。然后 , 你可以生成一个实现该接口并执行交换的代理 。这有助于简化 HTTP 远程访问,因为远程访问通常需要使用一个门面来封装使用底层 HTTP 客户端的细节 。
RestClient是一个同步 HTTP 客户端,提供现代、流畅的 API 。它为 HTTP 库提供了一个抽象 , 可以方便地从 Java 对象转换为 HTTP 请求,并从 HTTP 响应创建对象 。
下面分别介绍4个REST接口调用的详细使用 。
2. 远程接口调用RestTemplateRestTemplate 提供了比 HTTP 客户端库更高级别的 API 。它使调用 REST 端点变得简单易行 。它公开了以下几组重载方法:
方法
描述
getForObject
通过GET检索数据 。
getForEntity
使用 GET 获取响应实体(即状态、标头和正文) 。
headForHeaders
使用 HEAD 读取资源的所有标头 。
postForLocation
使用 POST 创建新资源,并从响应中返回位置标头 。
postForObject
使用 POST 创建一个新资源 , 并从响应中返回描述 。
postForEntity
使用 POST 创建一个新资源 , 并从响应中返回描述 。
put
使用 PUT 创建或更新资源 。
patchForObject
使用 PATCH 更新资源,并返回响应中的描述 。请注意 , JDK HttpURLConnection 不支持 PATCH,但 Apache HttpComponents 和其他组件支持 。
delete
使用 DELETE 删除指定 URI 上的资源 。
optionsForAllow
通过 ALLOW 读取资源允许使用的 HTTP 方法 。
exchange
前述方法的更通用(更少意见)版本,可在需要时提供额外的灵活性 。它接受一个 RequestEntity(包括作为输入的 HTTP 方法、URL、标题和正文) , 并返回一个 ResponseEntity 。
这些方法允许使用参数化类型引用(ParameterizedTypeReference)而不是类(Class)来指定具有泛型的响应类型 。
execute
执行请求的最通用方式,可通过回调接口完全控制请求准备和响应提取 。

  • 初始化
默认构造函数使用 java.NET.HttpURLConnection 来执行请求 。你可以通过 ClientHttpRequestFactory 的实现切换到不同的 HTTP 库 。目前,该程序还内置了对 Apache HttpComponents 和 OkHttp 的支持 。示例:
RestTemplate template = new RestTemplate(new HttpComponentsClientHttpRequestFactory());每个 ClientHttpRequestFactory 都会公开底层 HTTP 客户端库的特定配置选项 , 例如,凭证、连接池和其他细节 。
  • URIs
许多 RestTemplate 方法都接受 URI 模板和 URI 模板变量,可以是字符串变量参数,也可以是 Map<String,String> 。
String result = restTemplate.getForObject("http://pack.com/users/{userId}", String.class, 666) ;Map<String, ?>方式:
Map<String, Object> params = Collections.singletonMap("userId", 666);String result = restTemplate.getForObject("http://pack.com/users/{userId}", String.class, params) ;
  • Headers
可以使用 exchange() 方法指定请求头 , 如下例所示:
String uriTemplate = "http://pack.com/users/{userId}";URI uri = UriComponentsBuilder.fromUriString(uriTemplate).build(42);RequestEntity<Void> requestEntity = RequestEntity.get(uri).header("x-api-token", "aabbcc").build() ;ResponseEntity<String> response = template.exchange(requestEntity, String.class);String responseHeader = response.getHeaders().getFirst("x-version");String body = response.getBody() ;
  • body
如果你当前CLASSPATH存在MAppingJackson2HttpMessageConverter,那么你可以直接将请求结果映射为你所需要的结果对象,如下示例所示,将目标接口返回值直接转换为User对象 。


推荐阅读