上篇文件介绍Eureka服务的文章中,我们介绍到consumer从Eureka中通过LoadBalancerClient获取到服务端地址信息后通过RestTemplate来远程调用服务的场景,本文来具体介绍下RestTemplate的使用
RestTemplate
SpringRestTemplate是Spring 提供的用于访问 Rest 服务的客端, RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率,所以很多客户端比如Android或者第三方服务商都是使用RestTemplate 请求 restful服务
1.环境搭建
为了演示RestTemplate的使用,我们创建两个SpringBoot项目,一个provider作为server端,一个consumer作为服务调用方法
2.API方法介绍
API | 说明 |
---|---|
getForEntity() | 发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象 |
getForObject() | 发送一个HTTP GET请求,返回的请求体将映射为一个对象 |
postForEntity() | POST 数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得到的 |
postForObject() | POST 数据到一个URL,返回根据响应体匹配形成的对象 |
headForHeaders() | 发送HTTP HEAD请求,返回包含特定资源URL的HTTP头 |
optionsForAllow() | 发送HTTP OPTIONS请求,返回对特定URL的Allow头信息 |
postForLocation() | POST 数据到一个URL,返回新创建资源的URL |
put() | PUT 资源到特定的URL |
delete() | 在特定的URL上对资源执行HTTP DELETE操作 |
exchange() | 在URL上执行特定的HTTP方法,返回包含对象的ResponseEntity,这个对象是从响应体中映射得到的 |
execute() | 在URL上执行特定的HTTP方法,返回一个从响应体映射得到的对象 |
3.具体使用
3.1 无参请求
我们先来看下服务端请求方法不需要接收参数,
getForEntity
通过getForEntity来实现
服务端
/** * 无参,返回字符串 * @return */ @GetMapping("/server1") public String server1String(){ System.out.println("服务端被访问了..."); return "success"; }
调用
/** * RestTemplate 访问 provider的第一个服务 server1 */ @Test public void contextLoads() { String url = "http://localhost:8080/server1"; RestTemplate restTemplate = new RestTemplate(); ResponseEntity<String> entity = restTemplate.getForEntity(url, String.class); // 获取响应的状态 HttpStatus statusCode = entity.getStatusCode(); // 获取响应的header信息 HttpHeaders headers = entity.getHeaders(); // 获取响应的body信息 String msg = entity.getBody(); System.out.println(statusCode); System.out.println(headers); System.out.println(msg); }
输出结果
说明:
1.getForEntity()方法执行返回的类型是ResponseEntity<T>,ResponseEntity<T>是Spring对HTTP请求响应的封装,包括了几个重要的元素,如响应码、contentType、contentLength、响应消息体等,在输出结果中我们能够看到
2.getForEntity()的参数中第一个是请求地址,第二个是T对应的类型
getForObject
getForObject函数实际上是对getForEntity函数的进一步封装,如果你只关注返回的消息体的内容,对其他信息都不关注,此时可以使用getForObject
/** * getForObject 访问 */ @Test public void contextLoadsObject() { String url = "http://localhost:8080/server1"; RestTemplate restTemplate = new RestTemplate(); // 直接返回的就是我们需要的结果,但是获取不到对应的响应状态等信息 String msg = restTemplate.getForObject(url,String.class); System.out.println(msg); }
3.2 有参请求
服务端方法需要接收调用者传递的参数
/** * 有参,基本数据类型 返回字符串 * @return */ @RequestMapping("/server2") public String server2String(Integer id,String userName){ System.out.println("服务端被访问了..."+id+" "+userName); return "success--参数得到了"; } /** * 有参,基本数据类型 返回字符串 * @return */ @RequestMapping("/server3") public String server3String(User user){ System.out.println("服务端被访问了..."+user); return "success--参数得到了"; }
getForEntity
调用者可以通过两种方式调用
第一种方式通过数字占位符,最后是一个可变长度的参数,来一一替换前面的占位符
/** * 请求服务并且传递参数 * 基本数据类型 */ @Test public void testServer2(){ // 参数在链接地址后 String url = "http://localhost:8080/server2?id={1}&userName={2}"; RestTemplate restTemplate = new RestTemplate(); ResponseEntity<String> entity = restTemplate.getForEntity(url, String.class,5,"bobo"); System.out.println(entity.getBody()); }
第二种就是使用name={name}这种形式,最后一个参数是一个map,map的key即为前边占位符的名字,map的value为参数值
/**
* 请求服务并且传递参数
* 基本数据类型
*/
@Test
public void testServer3(){
String url = "http://localhost:8080/server2?id={id}&userName={userName}";
Map<String,Object> map = new HashMap<>();
map.put("id",6);
map.put("userName","波波烤鸭");
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> entity = restTemplate.getForEntity(url, String.class,map);
System.out.println(entity.getBody());
}
postForEntity
如果是post方式提交请求传递参数我们可以这样使用,如下
服务端:注意要加@RequestBody注解
/** * 有参,基本数据类型 返回字符串 * @return */ @RequestMapping("/server3") public String server3String(@RequestBody User user){ System.out.println("服务端被访问了..."+user); return "success--参数得到了"; }
客户端
/** * postForEntity(url,user,String.class) * url:请求地址 * user:请求提交的数据 * String.class 接收返回数据的类型 */ @Test public void contextLoadsObject1() { String url = "http://localhost:8080/server3"; RestTemplate restTemplate = new RestTemplate(); User user = new User(1,"bobo","中国"); // 直接返回的就是我们需要的结果,但是获取不到对应的响应状态等信息 String msg = restTemplate.postForEntity(url,user,String.class).getBody(); System.out.println(msg); }
3.3 返回自己类型
服务端返回的我们自定义类型的数据
/** * 返回自定义对象 * @return */ @RequestMapping("/server4") public User server4Object(){ System.out.println("服务端被访问了..."); return new User(2,"李四","深圳"); }
客户端:
/** * 返回类型为自定义类型 */ @Test public void testServer5(){ String url = "http://localhost:8080/server4"; RestTemplate restTemplate = new RestTemplate(); ResponseEntity<User> entity = restTemplate.getForEntity(url, User.class); System.out.println(entity.getBody()); }
使用getForEntity和getForObject及postForEntity和postForObject都差不多,注意接收的类型即可。
3.4 返回的list带泛型的场景
此处我们需要使用到exchange方法,特定如下
- 允许调用者指定HTTP请求的方法(GET,POST,PUT等)
- 可以在请求中增加body以及头信息,其内容通过参‘HttpEntity<?>requestEntity’描述
- exchange支持‘含参数的类型’(即泛型类)作为返回类型,该特性通过‘ParameterizedTypeReferenceresponseType’描述
客户端调用
/** * 返回 集合带泛型 * @return */ @RequestMapping("/server5") public List<User> server5List(){ System.out.println("服务端被访问了..."); return Arrays.asList(new User(2,"李四1","深圳") ,new User(3,"李四2","深圳") ,new User(4,"李四3","深圳")); }
好了~RestTemplate的基本使用我们就介绍到此处,更多相关Spring RestTemplate使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
时间:2020-03-20
Springboot RestTemplate 简单使用解析
Spring Boot RestTemplate提交表单数据的三种方法
Spring cloud restTemplate 传递复杂参数的方式(多个对象)
详解SpringBoot通过restTemplate实现消费服务
一.RestTemplate说明 RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率.前面的博客中http://www.jb51.net/article/132885.htm,已经使用Jersey客户端来实现了消费spring boot的Restful服务,接下来,我们使用RestTemplate来消费前面示例中的Restful服务,前面的示例: springboot整合H2内存
详解SpringBoot中RestTemplate的几种实现
RestTemplate的多种实现 使用JDK默认的http library 使用Apache提供的httpclient 使用Okhttp3 @Configuration public class RestConfig { @Bean public RestTemplate restTemplate(){ RestTemplate restTemplate = new RestTemplate(); return restTemplate; } @Bean("urlConnection"
Spring RestTemplate具体使用详解
Spring Boot使用RestTemplate消费REST服务的几个问题记录
Spring使用RestTemplate模拟form提交示例
springMVC中RestTemplate传值接值方法
我们需要给接口推送数据以及接口接收数据的时候,可以用springmvc中的一种简单方法 1.需要在spring-mvc.xml中配置信息转化器. <bean id = "stringHttpMessageConverter" class = "org.springframework.http.converter.StringHttpMessageConverter"/> <bean id="jsonHttpMessageConverter
SpringBoot RestTemplate 简单包装解析
Spring学习笔记之RestTemplate使用小结
前言 作为一个Java后端,需要通过HTTP请求其他的网络资源可以说是一个比较常见的case了:一般怎么做呢? 可能大部分的小伙伴直接捞起Apache的HttpClient开始做,或者用其他的一些知名的开源库如OkHttp, 当然原生的HttpURLConnection也是没问题的 本篇博文则主要关注点放在Sprig的生态下,利用RestTemplate来发起Http请求的使用姿势 I. RestTempalate 基本使用 0. 目标 在介绍如何使用RestTemplate之前,我们先抛出一些
Spring学习笔记1之IOC详解尽量使用注解以及java代码
Spring学习笔记2之表单数据验证、文件上传实例代码

在上篇文章给大家介绍了Spring学习笔记1之IOC详解尽量使用注解以及java代码,接下来本文重点给大家介绍Spring学习笔记2之表单数据验证.文件上传实例代码,具体内容,请参考本文吧! 一.表单数据验证 用户注册时,需要填写账号.密码.邮箱以及手机号,均为必填项,并且需要符合一定的格式.比如账号需要32位以内,邮箱必须符合邮箱格式,手机号必须为11位号码等.可以采用在注册时验证信息,或者专门写一个工具类用来验证:来看下在SpringMVC中如何通过简单的注释实现表单数据验证. 在javax
Spring学习之Bean的装配多种方法
我最近在研究Spring框架的路上,那么今天也算个学习笔记吧!学习一下如何实现Bean的装配方法 Bean的简介 Java开发者一般会听过JavaBean这个概念,所谓的JavaBean,其实就是符合sun规范的一种普通的Java对象,这种对象需要有一个空构造器,为属性添加set/get方法等,之所以这么设计,是为了方便使用反射技术对其进行操作,而在Spring中的Bean的概念则相对比较广泛一些,Spring中的Bean基本上可以包括所有需要使用到的对象,也就是说,基本上在Spring中的对象
Spring学习之开发环境搭建的详细步骤

最近搞定了项目,工作终于松了下来,顺便有时间学习Spring框架,记录于此,不足之处,希望大家不吝赐教 Spring的介绍 Spring是一个轻量级的Java框架,由于Spring基本提供了全套的开发服务,所以Spring基本上可以应用在Java开发中的很多方面,从本周开始学习Spring框架,顺便将自己的学习笔记整理出来,以巩固自己的学习,增进自己的表达能力,加深对Spring的了解 Spring体系结构 Spring的体系结构可以从官方文档中得知,具体如下所示: Spring体系结构 从上面
springmvc学习笔记-返回json的日期格式问题的解决方法
JavaScript学习笔记之DOM基础 2.4
angularjs学习笔记之简单介绍
AngularJS学习笔记之表单验证功能实例详解
原文
https://www.zhangshengrong.com/p/QrXebep41d/
本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Spring RestTemplate基本使用介绍