在前面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()
传递参数主要为以下两种:
- 通过占位符实现
//使用数字做占位符,由后面可变长度的参数,替换占位符
getForEntity("url?字段={数字}","返回对象的类","占位符对应的参数...(可变长度)")
//参数是一个map,map的key即为前边占位符的名字,map的value为参数值
getForEntity("url?字段={参占位符名字}","返回对象的类","存放参数的map")
- 通过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还提供了exchange和execute两种请求方法,这两种使用范围更广,允许调用者指定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方法
上述的getForXXX、postForXXX、put、exchange、delete的最后都是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)