在前面SpringCloud之整合ribbon中,我通过RestTemplate实现了多个服务之前的接口调用,在实际开发业务中,我们也会遇到请求第三方接口的需求,这个时候就可以用上RestTemplate。

目录

  • 一、RestTemplate是什么
  • 二、配置方法
  • 三、常用方法
  • 3.1 GET请求
  • 3.1.1 getForEntity
  • 3.1.2 getForObject
  • 3.2 POST请求
  • 3.2.1 postForEntity
  • 3.2.3 postForObject
  • 3.2.3 postForLocation
  • 3.3 PUT请求
  • 3.4 DELETE请求
  • 3.5 补充
  • 3.5.1 exchange方法
  • 3.5.2 execute方法

一、RestTemplate是什么

RestTemplate是Spring从3.0版本开始提供的访问远程Http服务的工具,提供了常见的REST请求方案的模版,能够大大提高客户端的编写效率。

RestTemplate默认依赖jdk的HTTP连接工具。当然你也可以 通过setRequestFactory属性切换到不同的HTTP源,比如Apache HttpComponents、Netty和OkHttp。

二、配置方法

在Spring中使用RestTemplate,需要将RestTemplate交给工厂管理,主要为以下两种方法:

  • XML配置
  • 代码配置

三、常用方法

常用请求主要分为以下四种:

  • GET请求
  • POST请求
  • PUT请求
  • DELETE请求

3.1 GET请求

发送GET请求用来获取资源。

3.1.1 getForEntity

返回值是一个ResponseEntity<T>,ResponseEntity是Spring对HTTP请求响应的封装。

/**
 * @url : 路径
 * @responseType : 返回消息体的类
 * @uriVariables :可变长度参数
 **/
<T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables)
/**
 * @url : 路径
 * @responseType : 返回消息体的类
 * @uriVariables :参数map
 **/
<T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables
/**
 * @url : 使用UriComponents构建的路径
 * @responseType : 返回消息体的类
 **/
<T> ResponseEntity<T> getForEntity(URI url, Class<T> responseType)
 //获取返回数据的body
 responseEntity.getBody();
 //获取状态码
 responseEntity.getStatusCode();
 //获取状态码的值
 responseEntity.getStatusCodeValue();
 //获取请求头
 responseEntity.getHeaders()

传递参数主要为以下两种:

  1. 通过占位符实现
//使用数字做占位符,由后面可变长度的参数,替换占位符
getForEntity("url?字段={数字}","返回对象的类","占位符对应的参数...(可变长度)")
//参数是一个map,map的key即为前边占位符的名字,map的value为参数值
getForEntity("url?字段={参占位符名字}","返回对象的类","存放参数的map")
  1. 通过UriComponents来构建Uri传递参数(不是String)
UriComponents uriComponents = UriComponentsBuilder.fromUriString("url?字段={占位符}").build().expand("参数).encode();

3.1.2 getForObject

是对getForEntity的进一步封装,只返回消息体

/**
 * @url : 路径
 * @responseType : 返回对象的类
 * @uriVariables :可变长度参数
 **/
<T> T getForObject(String url, Class<T> responseType, Object... uriVariables)
/**
 * @url : 路径
 * @responseType : 返回对象的类
 * @uriVariables :参数map
 **/
<T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables
/**
 * @url : 使用UriComponents构建的路径
 * @responseType : 返回对象的类
 **/
<T> T getForObject(URI url, Class<T> responseType)

传递参数方式与getForEntity一致

3.2 POST请求

发送POST请求用来新建资源或者更新资源

controller类通过 @RequestBody 注解接收请求体

3.2.1 postForEntity

和get请求的getForEntity相似

/**
 * @url : 路径
 * @request : 请求体
 * @responseType : 返回消息体的类
 * @uriVariables :可变长度参数
 **/
<T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables)
/**
 * @url : 路径
 * @request : 请求体
 * @responseType : 返回消息体的类
 * @uriVariables :参数map
 **/
<T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables
/**
 * @url : 使用UriComponents构建的路径
 * @request : 请求体
 * @responseType : 返回消息体的类
 **/
<T> ResponseEntity<T> postForEntity(URI url, @Nullable Object request, Class<T> responseType)

传递参数与getForEntity的一致

3.2.3 postForObject

是对postForEntity的进一步封装,只返回消息体

/**
 * @url : 路径
 * @request : 请求体
 * @responseType : 返回对象的类
 * @uriVariables :可变长度参数
 **/
<T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables)
/**
 * @url : 路径
 * @request : 请求体
 * @responseType : 返回对象的类
 * @uriVariables :参数map
 **/
<T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables
/**
 * @url : 使用UriComponents构建的路径
 * @request : 请求体
 * @responseType : 返回对象的类
 **/
<T> T postForObject(URI url, @Nullable Object request, Class<T> responseType)

用法和getForObject一致。

3.2.3 postForLocation

提交资源功之后,返回新资源的URI

/**
 * @url : 返回新资源的路径
 * @request : 请求体
 * @uriVariables :可变长度参数
 **/
URI postForLocation(String url, @Nullable Object request, Object... uriVariables)
/**
 * @url : 返回新资源的路径
 * @request : 请求体
 * @uriVariables :参数map
 **/
URI postForLocation(String url, @Nullable Object request, Map<String, ?> uriVariables)
/**
 * @url : 返回新资源的路径
 * @request : 请求体
 **/
URI postForLocation(URI url, @Nullable Object request)

3.3 PUT请求

发送PUT请求用来更新资源

put方法没有返回值

/**
 * @url : 返回新资源的路径
 * @request : 请求体
 * @uriVariables :可变长度参数
 **/
void put(String url, @Nullable Object request, Object... uriVariables)
/**
 * @url : 返回新资源的路径
 * @request : 请求体
 * @uriVariables :参数map
 **/
void put(String url, @Nullable Object request, Map<String, ?> uriVariables)
/**
 * @url : 返回新资源的路径
 * @request : 请求体
 **/
void put(URI url, @Nullable Object request)

3.4 DELETE请求

发送DELETE请求用来删除资源

/**
 * @url : 返回新资源的路径
 * @uriVariables :可变长度参数
 **/
void delete(String url, Object... uriVariables)
/**
 * @url : 返回新资源的路径
 * @uriVariables :参数map
 **/
void delete(String url, Map<String, ?> uriVariables)
/**
 * @url : 返回新资源的路径
 **/
void delete(URI url)

3.5 补充

除了上面四种请求,redisTemplate还提供了exchangeexecute两种请求方法,这两种使用范围更广,允许调用者指定HTTP请求的方法

3.5.1 exchange方法

  • 允许调用者指定HTTP请求的方法(GET,POST,PUT等)
  • 可以在请求中增加body以及头信息,其内容通过参数‘HttpEntity<?>requestEntity’描述
  • exchange支持‘含参数的类型’(即泛型类)作为返回类型,该特性通过‘ParameterizedTypeReferenceresponseType’描述
/**
 * @url : 返回新资源的路径
 * @method : HTTP请求方法(GET、POST、PUT等)
 * @requestEntity : HttpEntity对象,封装了请求头和请求体
 * @responseType : 返回消息体的类
 * @uriVariables :可变长度参数
 **/
<T> ResponseEntity<T> exchange(String url, HttpMethod method, @Nullable HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables)
/**
 * @url : 返回新资源的路径
 * @method : HTTP请求方法(GET、POST、PUT等)
 * @requestEntity : HttpEntity对象,封装了请求头和请求体
 * @responseType : 返回消息体的类
 * @uriVariables :参数map
 **/
<T> ResponseEntity<T> exchange(String url, HttpMethod method, @Nullable HttpEntity<?> requestEntity, Class<T> responseType, Map<String, ?> uriVariables)
/**
 * @url : 返回新资源的路径
 * @method : HTTP请求方法(GET、POST、PUT等)
 * @requestEntity : HttpEntity对象,封装了请求头和请求体
 * @responseType : 返回消息体的类
 **/
<T> ResponseEntity<T> exchange(URI url, HttpMethod method, @Nullable HttpEntity<?> requestEntity, Class<T> responseType)
/**
 * @url : 返回新资源的路径
 * @method : HTTP请求方法(GET、POST、PUT等)
 * @requestEntity : HttpEntity对象,封装了请求头和请求体
 * @responseType : 
 * @uriVariables :可变长度参数
 **/
 <T> ResponseEntity<T> exchange(String url, HttpMethod method, @Nullable HttpEntity<?> requestEntity, ParameterizedTypeReference<T> responseType, Object... uriVariables)
/**
 * @url : 返回新资源的路径
 * @method : HTTP请求方法(GET、POST、PUT等)
 * @requestEntity : HttpEntity对象,封装了请求头和请求体
 * @responseType : 返回类型
 * @uriVariables :参数map
 **/
 <T> ResponseEntity<T> exchange(String url, HttpMethod method, @Nullable HttpEntity<?> requestEntity, ParameterizedTypeReference<T> responseType, Map<String, ?> uriVariables)
/**
 * @url : 返回新资源的路径
 * @method : HTTP请求方法(GET、POST、PUT等)
 * @requestEntity : HttpEntity对象,封装了请求头和请求体
 * @responseType : 返回类型
 **/
 <T> ResponseEntity<T> exchange(URI url, HttpMethod method, @Nullable HttpEntity<?> requestEntity, ParameterizedTypeReference<T> responseType)
/**
 * entity : 将url、method、responseType封装的对象
 * @responseType : 返回类型
 **/
<T> ResponseEntity<T> exchange(RequestEntity<?> entity, Class<T> responseType)
/**
 * entity : 将url、method、responseType封装的对象
 * @responseType : 返回类型
 **/
<T> ResponseEntity<T> exchange(RequestEntity<?> entity, ParameterizedTypeReference<T> responseType)

3.5.2 execute方法

上述的getForXXXpostForXXXputexchangedelete的最后都是execute方法,例如:

@Override
public <T> T getForObject(String url, Class<T> 	responseType, Object... urlVariables) throws 	RestClientException {
 RequestCallback requestCallback =     acceptHeaderRequestCallback(responseType);
 HttpMessageConverterExtractor<T> responseExtractor =
<span style="white-space:pre">	</span>new HttpMessageConverterExtractor<T>(responseType, getMessageConverters(), logger);
 return execute(url, HttpMethod.GET, requestCallback, responseExtractor, urlVariables);
}
/**
 * @url : 返回新资源的路径
 * @method : HTTP请求方法(GET、POST、PUT等)
 * @requestCallback : 用于操作请求头和body
 * @responseExtractor : 解析HTTP响应的数据
 * @uriVariables :可变长度参数
 **/
<T> T execute(String url, HttpMethod method, @Nullable RequestCallback requestCallback, @Nullable ResponseExtractor<T> responseExtractor, Object... uriVariables)
/**
 * @url : 返回新资源的路径
 * @method : HTTP请求方法(GET、POST、PUT等)
 * @requestCallback : 用于操作请求头和body
 * @responseExtractor : 解析HTTP响应的数据
 * @uriVariables :参数map
 **/
<T> T execute(String url, HttpMethod method, @Nullable RequestCallback requestCallback, @Nullable ResponseExtractor<T> responseExtractor, Map<String, ?> uriVariables)