本篇内容来自翟永超的《Springcloud微服务实战》,转载请注明。

一、GET请求

在RestTemplate中,对GET请求可以通过如下两个方法进行调用实现。

第一种:getForEntity函数。

该方法返回的是ResponseEntity,该对象是Spring对HTTP请求响应的封装,其中主要存储了HTTP的几个重要元素,比如HTTP请求状态码的枚举对象HttpStatus(也就是我们常说的404、500这些错误码)、在它的父类HttpEntity中还存储着HTTP请求的头信息对象HttpHeaders以及泛型类型的请求体对象。

比如下面的例子,就是访问USER-SERVER服务的/user请求,同时最后一个参数didi会替换url中的{1}占位符,而返回的ResponseEntity对象中的body内容类型会根据第二个参数转换为String类型。

RestTemplaterestTemplate=newRestTemplate();
ResponseEntity<String>responseEntity=restTemplate.getForEntity("http://USERSERVICE/user?name={1}",String.class,"didi");
Stringbody=responseEntity.getBody();

若我们希望返回的body是一个User对象类型,也可以这样实现:

RestTemplaterestTemplate=newRestTemplate();
ResponseEntity<User>responseEntity=restTemplate.getForEntity("http://USERSERVICE/user?name={1}",User.class,"didi");
Userbody=responseEntity.getBody();

上面的例子是比较常用的方法,getForEntity函数实际上提供了以下三种不同的重载实现。

1.getForEntity(Stringurl,Class responseType,Object...urlVariables):

该方法提供了三个参数,其中url为请求的地址,responseType为请求响应体body的包装类型,urlVariables为url中的参数绑定。GET请求的参数绑定通常使用url中拼接的方式,

比如http://USER-SERVICE/user?name=did我们可以像这样自已将参数拼接到url中,但更好的方法是在url中使用占位符并配合urlVariables参数实现GET请求的参数绑定,比如url定义为htip://USER-SERVICE/user?name={1},然后可以这样来调用:

getForEntity("http://USER-SERVICE/user?name={1}",String.class,"didi")'其中第三个参数didi会替换url中的{1}占位符。

这里需要注意的是,由于urlVariables参数是一个数组,所以它的顺序会对应url中占位符定义的数字顺序。

2.getForEntity(String url,Class responseType,Map urlVariables):

该方法提供的参数中,只有urlVariables的参数类型与上面的方法不同。这里使用了Map类型,所以使用该方法进行参数绑定时需要在占位符中指定Map中参
数的key值,比如url定义为http://USER-SERVICE/user?name={name),在Map类型的urlVariables中,我们就需要put一个key为name的参数来绑
定url中{name}占位符的值,比如:

RestTemplate restTemplate=new RestTemplate();
Map<String,String> params=new HashMap<>();
params.put("name","dada");
ResponseEntity<String> responseEntity=restTemplate.getForEntity("http://USERSERVICE/user?name={name}",String.class,params);

3.getForEntity(URI url,Class responseType):

该方法使用URI对象来替代之前的url和urlVariables参数来指定访问地址和参数绑定。URI是JDK java.net包下的一个类,它表示一个统一资源标识符(Uniform Resource Identifier)引用。比如下面的例子:

RestTemplate restTemplate=new RestTemplate();
UriComponents uriComponents=UriComponentsBuilder.fromUriString(
"http://USER-SERVICE/user?name={name}")
.build()
.expand("dodo")
.encode();
URI uri=uriComponents.toUri();
ResponseEntity<String> responseEntity=restTemplate.getForEntity(uri,String.class).getBody();

第二种:getForObject函数。

该方法可以理解为对getForEntity的进一步封装,它通过HttpMessageConverterExtractor对HTTP的请求响应体body内容进行对象转换,实现请求直接返回包装好的对象内容。比如:

RestTemplate restTemplate=new RestTemplate();
String result=restTemplate.getForObject(uri,String.class);

当body是一个User对象时,可以直接这样实现:

RestTemplate restTemplate=new RestTemplate();
User result=restTemplate.getForObject(uri,User.class);

当不需要关注请求响应除body外的其他内容时,该函数就非常好用,可以少一个从Response中获取body的步骤。它与getForEntity函数类似,也提供了三种不同的重载实现。

1.getForObject(String url,Class responseType,Object...urlVariables):

与getForEntity的方法类似,url参数指定访问的地址,responseType参数定义该方法的返回类型,urlVariables参数为url中占位符对应的参数。

2.getForObject(String url,Class responseType,Map urlVariables):

在该函数中,使用Map类型的urlVariables替代上面数组形式的urlVariables,因此使用时在url中需要将占位符的名称与Map类型中的key一 一对应设置。

3.getForObject(URI url,Class responseType):

该方法使用URI对象来替代之前的url和urlVariables参数使用。

二、POST请求

在RestTemplate中,对POST请求时可以通过如下三个方法进行调用实现。

第一种:postForEntity函数。

该方法同GET请求中的getForEntity类似,会在调用后返回ResponseEntity<T>对象,其中T为请求响应的body类型。

比如下面这个例子,使用postForEntity提交POST请求到USER-SERVICE服务的/user接口,提交的body内容为user对象,请求响应返回的body类型为String。

RestTemplate restTemplate=new RestTemplate();
User user=newUser("didi",30);
ResponseEntity<String> responseEntity=restTemplate.postForEntity("http://USER-SERVICE/user",user,String.class);
String body=responseEntity.getBody();

postForEntity函数也实现了三种不同的重载方法。

1.postForEntity(String url,Object request,Class responseType,Object... uriVariables)

2.postForEntity(String url,Object request,Class responseType,Map uriVariables)

3.postForEntity(URI url,Object request,Class responseType)

这些函数中的参数用法大部分与getForEntity一致,比如,第一个重载函数和第二个重载函数中的uriVariables参数都用来对url中的参数进行绑定使用;
responseType参数是对请求响应的body内容的类型定义。

这里需要注意的是新增加的request参数,该参数可以是一个普通对象,也可以是一个HttpEntity对象。

如果是一个普通对象,而非HttpEntity对象的时候,RestTemplate会将请求对象转换为一个HttpEntity对象来处理,其中Object就是request的类型,request内容会被视作完整的body来处理;

而如果request是一个HttpEntity对象,那么就会被当作一个完成的HTTP请求对象来处理,这个request中不仅包含了body的内容,也包含了header的内容。

第二种:postForObject函数。

该方法也跟getForObject的类型类似,它的作用是简化postForEntity的后续处理。通过直接将请求响应的body内容包装成对象来返回使用,比如下面的例子:

RestTemplate restTemplate=new RestTemplate();
User user=new User("didi",20);
StringpostResult=restTemplate.postForObject("http://USER-SERVICE/user",user,String.class);

postForObject函数也实现了三种不同的重载方法:

1.postForObject(String url,Object request,Class responseType,Object... uriVariables)

2.postForObject(String url,Object request,Class responseType,Map uriVariables)

3.postForObject(URI url,Object request,Class responseType)

这三个函数除了返回的对象类型不同,函数的传入参数均与postForEntity一致,因此可参考之前postForEntity的说明。

第三种:postForLocation函数。

该方法实现了以POST请求提交资源,并返回新资源的URI,比如下面的例子:

User user=new User("didi",40);
URI responseURI=restTemplate.postForLocation("http://USER-SERVICE/user",user);

postForLocation函数也实现了三种不同的重载方法:

1.postForLocation(String url,Object request,Object... urlVariables)

2.postForLocation(Stringurl,Object request,Map urlVariables)

3.postForLocation(URI url,Object request)

由于postForLocation函数会返回新资源的URI,该URI就相当于指定了返回类型,所以此方法实现的POST请求不需要像postForEntity和postForObject那样指定responseType。其他的参数用法相同。

三、PUT请求

在RestTemplate中,对PUT请求可以通过put方法进行调用实现,比如:

RestTemplate restTemplate=new RestTemplate();
Longid=100011;
User user=new User("didi",40);
restTemplate.put("http://USER-SERVICE/user/{l}",user,id);

put函数也实现了三种不同的重载方法:

1.put(String url,Object request,Object... urlVariables)

2.put(String url,Object request,Map urlVariables)

3.put(URI url,Object request)

put函数为void类型,所以没有返回内容,也就没有其他函数定义的responseType参数,除此之外的其他传入参数定义与用法与postForObject基本一致。

四、DELETE请求

在RestTemplate中,对DELETE请求可以通过delete方法进行调用实现,比如:

RestTemplate restTemplate=new RestTemplate();
Longid=10001L;
restTemplate.delete("http://USER-SERVICE/user/{1)",id);

delete函数也实现了三种不同的重载方法:

1.delete(String url,Object... urlVariables)

2.delete(String url,Map urlVariables)

3.delete(URI url)

由于我们在进行REST请求时,通常都将DELETE请求的唯一标识拼接在url中,所以DELETE请求也不需要request的body信息,就如上面的三个函数实现一样,非常简单。
url指定DELETE请求的位置,urlVariables绑定url中的参数即可。

spring boot单元测试之RestTemplate(三)——api详解的更多相关文章

  1. spring boot单元测试之RestTemplate(二)

    上篇博客中,简单介绍了RestTemplate,只是用到了单元测试环节,如果在正式开发环境使用RestTemplate调用远程接口,还有一些配置要做. 一.配置类 由于Spring boot没有对Re ...

  2. spring boot单元测试之RestTemplate(一)

    写代码重要,写好的代码准确无误,且符合预期那更是必不可少. spring boot内嵌了专门的单元测试模块——RestTemplate,保证了程序员可以对自己的代码进行及时的测试. 闲言少叙,直接上代 ...

  3. Spring Boot 启动(二) 配置详解

    Spring Boot 启动(二) 配置详解 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring Boot 配置 ...

  4. spring boot单元测试之MockMvc

    spring单元测试之MockMvc,这个只是模拟,并不是真正的servlet,所以session.servletContext是没法用的. @RunWith(SpringRunner.class) ...

  5. Spring Boot属性配置文件:application.properties 详解

    学习资料 网址 官方说明文档 https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-pro ...

  6. Spring Boot 系列:日志动态配置详解

    世界上最快的捷径,就是脚踏实地,本文已收录架构技术专栏关注这个喜欢分享的地方. 开源项目: 分布式监控(Gitee GVP最有价值开源项目 ):https://gitee.com/sanjianket ...

  7. Spring Boot中使用MyBatis注解配置详解(1)

    之前在Spring Boot中整合MyBatis时,采用了注解的配置方式,相信很多人还是比较喜欢这种优雅的方式的,也收到不少读者朋友的反馈和问题,主要集中于针对各种场景下注解如何使用,下面就对几种常见 ...

  8. Spring Boot系列教程四:配置文件详解properties

    一.配置随机数,使用随机数 在application.properties文件添加配置信息 #32位随机数 woniu.secret=${random.value} #随机整数 woniu.numbe ...

  9. Spring Boot中使用MyBatis注解配置详解

    传参方式 下面通过几种不同传参方式来实现前文中实现的插入操作. 使用@Param 在之前的整合示例中我们已经使用了这种最简单的传参方式,如下: @Insert("INSERT INTO US ...

随机推荐

  1. Java获取URL对应的资源

    Java获取URL对应的资源   认识IP.认识URL是进行网络编程的第一步.java.net.URL提供了丰富的URL构建方式,并可以通过java.net.URL来获取资源.   一.认识URL   ...

  2. git 修改仓库地址

    公司服务器地址换了 , 原来的git代码地址也跟着需要变 , git remote rm origin 执行该操作 , 删除原来的git地址 git remote -v 查看一下有没有删除成功 , ( ...

  3. 纯洁CSS3实现图片墙

    预赛 DIV+CSS基金会 CSS3的transform 和 transition说明 主要用于transform的rotate/scale 动画过渡的几个參数(transition-property ...

  4. Android系统联系人全特效实现(下),字母表快速滚动

    在上一篇文章中,我和大家一起实现了类似于Android系统联系人的分组导航和挤压动画功能,不过既然文章名叫做<Android系统联系人全特效实现>,那么没有快速滚动功能显然是称不上&quo ...

  5. windows通过使用xShell远程linux上传文件

    上传文件rz与sz命令,远程linux您需要在系统上安装lrzsz工具包 安装例如,下面的: [xxxx@xxxx /]# yum install lrzsz 注意:我用命令yum,假设在Intern ...

  6. centos 6 防火墙开启端口无效问题

    昨天尝试redis在centos的安装,配置文件都检查了,外网就是不能访问 #添加端口开启 $ iptables -A INPUT -p tcp --dport 6379 -j ACCEPT #保存配 ...

  7. 深入WPF中的图像画刷(ImageBrush)之1——ImageBrush使用举例

    原文:深入WPF中的图像画刷(ImageBrush)之1--ImageBrush使用举例 昨天我在<简述WPF中的画刷(Brush)  >中简要介绍了WPF中的画刷的使用.现在接着深入研究 ...

  8. PMP项目经理认证

    PMP认证是由美国项目管理学会(PMI)在全球范围内推出的针对项目经理的资格认证体系,通过该认证的项目经理叫"PMP",即Project Management Profession ...

  9. Matlab Tricks(二十)—— Hilbert matrix 的创建

    Hij=1i+j−1 N = 5; A = ones(N, 1)*(1:N); B = A'; H = 1./(M+N-1);

  10. React路由配置

    React路由简单配置 //入口文件index.js import React from 'react'; import ReactDom from 'react-dom'; import { Rou ...