IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring框架(七)——RestTemplate -> 正文阅读

[Java知识库]Spring框架(七)——RestTemplate

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

一、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)
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:11:18  更:2022-04-01 23:15:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:42:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码