文章目录

  • 一、RestTemplate
  • 二、GET 方法
  • 三、POST 方法
  • 四、PUT 方法
  • 五、DELETE 方法

一、RestTemplate

RestTemplate 是从 Spring3.0 开始支持的一个 Http 请求工具,这个请求工具和 Spring Boot 无关,更和 Spring Cloud 无关。

RestTemplate 提供了常见的 REST 请求方法模板,例如 GET、POST、PUT、DELETE 请求以及一些通用的请求执行方法 exchange 和 execute 方法。

RestTemplate 本身实现了 RestOperations 接口,而在 RestOperations 接口中,定义了常见的 RESTful 操作,这些操作在 RestTemplate 中都得到了很好的实现

二、GET 方法

首先我们在 provider 中定义一个 hello2 接口:

@GetMapping("/hello2")
public String hello2(String name) {return "hello " + name;
}

接下来,我们在 consumer 去访问这个接口,这个接口是一个 GET 请求,所以访问方式就是调用 RestTemplate 中的get 请求

可以看到,在 RestTemplate 中,关于 GET 请求,一共有如下两大类方法:

这两大类方法实际上是重载的,唯一不同的,就是返回值类型

getForObject 返回的是一个对象,这个对象就是服务端返回的具体值。

getForEntity 返回的是一个ResponseEntity,这个ResponseEntity 中除了服务端返回的具体数据外,还保留了 Http 响应头的数据

 @GetMapping("/hello4")public void hello4() {//使用 getForObjectString forObject = restTemplate.getForObject("http://provider/hello2?name={1}",String.class, "Yolo");System.out.println(forObject);//使用 getForEntity,并获得其他属性ResponseEntity<String> forEntity = restTemplate.getForEntity("http://provider/hello2?name={1}",String.class, "Yolo");String body = forEntity.getBody();System.out.println(body);HttpStatus statusCode = forEntity.getStatusCode();System.out.println(statusCode);int statusCodeValue = forEntity.getStatusCodeValue();System.out.println(statusCodeValue);HttpHeaders headers = forEntity.getHeaders();System.out.println("*********  header  *********");for (String s : headers.keySet()) {System.out.println(s+" : "+headers.get(s));}}


这里大家可以看到,getForObject 直接拿到了服务的返回值,getForEntity 不仅仅拿到服务的返回值,还拿到 http 响应的状态码。

然后,启动 Eureka Server、provider 以及 consumer ,访问 consumer 中的 hello4 接口,既可以看到请求结果。

看清楚两者的区别之后,接下来看下两个各自的重载方法,getForObject 和 getForEntity 分别有三个重载方法,两者的三个重载方法基本都是一致的。

所以,这里,我们主要看其中一种。三个重载方法,其实代表了三种不同的传参方式。

 @GetMapping("/hello5")public void hello5() throws UnsupportedEncodingException {String forObject = restTemplate.getForObject("http://provider/hello2?name={1}", String.class, "Yolo");System.out.println(forObject);Map<String ,Object> map = new HashMap<>();map.put("name","Yolo_map");String s1 = restTemplate.getForObject("http://provider/hello2?name={name}", String.class, map);System.out.println(s1);String url = "http://provider/hello2?name="+ URLEncoder.encode("张三","UTF-8");URI uri = URI.create(url);String s = restTemplate.getForObject(uri, String.class);System.out.println(s);}

这就是所说的三种传参方式

三、POST 方法

首先在 provider 中提供两个 POST 接口,同时,因为 POST 请求可能需要传递 JSON,所以,这里我们创建一个普通的 Maven 项目作为 commons 模块,然后这个 commons 模块被 provider 和 consumer 共同引用,这样我们就可以方便的传递 JSON 了。

注意这里的模块需要创建为普通的 maven 模块,不可以创建为SpringBoot项目:具体原因点击参考

commons 模块创建成功后,首先在 commons 模块中添加 User 对象,然后该模块分别被 provider 和 consumer 引用。

然后,在 provider 中提供两个 post 接口:

 @PostMapping("/user1")public User addUser1(User user) {return user;}@PostMapping("/user2")public User addUser2(@RequestBody User user) {return user;}

这里定义了两个 User 添加的方法,两个方法代表了两种不同的传参方式。第一种方法是以 key/value形式来传参,第二种方法是以 JSON 形式来传参。

定义完成后,接下来,我们在 consumer 中调用这两个 POST 接口。

可以看到,这里的 post 和前面的 get 非常像,只是多出来了三个方法,就是 postForLocation,另外两个 postForObject 和 postForEntiy 和前面 get 基本一致,所以这里我们主要来看 postForObject,看完之后,我们再来看这个额外的 postForLocation。

 @GetMapping("/hello7")public void hello7() {MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();map.add("username", "yolo");map.add("password", "123");map.add("id", 99);User user = restTemplate.postForObject("http://provider/user1", map,User.class);System.out.println(user);user.setId(98);user = restTemplate.postForObject("http://provider/user2", user,User.class);System.out.println(user);}

post 参数到底是 key/value 形式还是 json 形式,主要看第二个参数,如果第二个参数是 MultiValueMap ,则参数是以 key/value 形式来传递的,

如果是一个普通对象,则参数是以 json 形式 来传递的。

最后再看看一下 postForLocation 。

有的时候,当执行完一个 post 请求之后,立马要进行重定向,一个非常常见的场景就是注册,注册是一个 post 请求,注册完成之后,立马重定向到登录页面去登录。

对于这种场景,我们就可以使用 postForLocation。

首先,在 provider 上提供一个用户注册接口:

@Controller
public class RegisterController {@PostMapping("/register")public String register(User user) {return "redirect:http://provider/loginPage?username=" +user.getUsername();}@GetMapping("/loginPage")@ResponseBodypublic String loginPage(String username) {return "loginPage:" + username;}
}

注意,这里的 post 接口,响应一定是 302,否则 postForLocation 无效。

注意,重定向的地址,一定要写成绝对路径,不要写相对路径,否则在 consumer 中调用时会出问题

这就是 postForLocation ,调用该方法返回的是一个 Uri,这个 Uri 就是重定向的地址(里边也包含了重定向的参数),拿到 Uri 之后,就可以直接发送新的请求了。

四、PUT 方法

PUT 请求比较简单,重载的方法也比较少

我们首先在 provider 中提供一个 PUT 接口:

 @PutMapping("/user3")public void updateUser1(User user) {System.out.println(user);}@PutMapping("/user4")public void updateUser2(@RequestBody User user) {System.out.println(user);}

注意,PUT 接口传参其实和 POST 很像,也接受两种类型的参数,key/value 形式以及 JSON 形式。

在 consumer 中,我们来调用该接口:

 @GetMapping("/hello9")public void hello9() {MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();map.add("username", "yolo");map.add("password", "123");map.add("id", 99);restTemplate.put("http://provider/user3", map);User user = new User();user.setId(98);user.setUsername("zhangsan");user.setPassword("456");restTemplate.put("http://provider/user4", user);}

consumer 中的写法基本和 post 类似,也是两种方式,可以传递两种不同类型的参数。

五、DELETE 方法

DELETE 也比较容易,我们有两种方式来传递参数,key/value 形式或者 PathVariable(参数放在路径中),首先我们在 provider 中定义两个 DELETE 方法:

 @DeleteMapping("/user1")public void deleteUser1(Integer id) {System.out.println(id);}@DeleteMapping("/user2/{id}")public void deleteUser2(@PathVariable Integer id) {System.out.println(id);}

然后在 consumer 中调用这两个删除的接口:

 @GetMapping("/hello10")public void hello10() {restTemplate.delete("http://provider/user1?id={1}", 99);restTemplate.delete("http://provider/user2/{1}", 99);}

delete 中参数的传递,也支持 map,这块实际上和 get 是一样的。

学习 RestTemplate 一篇文章就够了 !!!相关推荐

  1. 学习 MongoDB 一篇文章就够了(珍藏版)

    文章目录 一.学习目录 二.扩展目录 一.学习目录 认识 MongoDB 一篇文章就够了 Windows平台安装MongoDB教程 Linux 上安装 MongoDB windows 安装 Mongo ...

  2. Android:学习AIDL,这一篇文章就够了(下)

    前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...

  3. 学习 HTML5 Canvas 这一篇文章就够了

    一.canvas 简介 ​<canvas> 是 HTML5 新增的,一个可以使用脚本(通常为 JavaScript) 在其中绘制图像的 HTML 元素.它可以用来制作照片集或者制作简单(也 ...

  4. 全面认识二极管,一篇文章就够了

    电子设计基础元器件 二极管,小小二极管,大大用途. ... 矜辰所致 目录 前言 一.二极管基础知识 1.1 什么是二极管 1.2 二极管的组成 1.3 二极管的原理 二.二极管特性 2.1 伏安特性 ...

  5. 关于VR产品的前世今生,看这一篇文章就够了

    关于VR产品的前世今生,看这一篇文章就够了(转) 文/胡勇 即使最富质疑精神最冷静的人也无法漠视现在的 VR/AR 掀起的狂潮,这个从科技圈蔓延到实业界最后席卷大众的想象力的狂欢正以前所未有的态势改变 ...

  6. 五年程序员是如何玩转闲鱼无货源的,只看这一篇文章就够了

    今天的内容方向主要是基础篇-进阶篇 ,优化了一下操作方法,尽量细化,让你看完这篇内容之后从入门到大神. 基础篇: 注册这些基础的之前说过,这次就不说了,这次说下如何养号. 完善个人资料(头像.昵称.简 ...

  7. 架构师必须搞懂DNS,一篇文章就够了。

    转载自 架构师必须搞懂DNS,一篇文章就够了. 概念 DNS,全称Domain Name System,即域名系统,搞清楚,它不是DNF地下城与勇士. DNS是怎么来的,我们知道要访问一个服务器的资源 ...

  8. 集成Android免费语音合成功能(在线、离线、离在线融合),有这一篇文章就够了(离线)

    原址 集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(在线) 集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(离在线融合)     ...

  9. 全面认识MOS管,一篇文章就够了

    基础知识中 MOS 部分迟迟未整理,实际分享的电路中大部分常用电路都用到了MOS管, 今天势必要来一篇文章,彻底掌握mos管! ...更新:为什么常在MOS管GS并联电阻? ...更新:为什么要在MO ...

最新文章

  1. 如何创建一个数据科学项目?
  2. 几个SQL命令的使用
  3. Tensorflow中张量数据类型的转换
  4. php单表显示动态下拉框,PHP:使用optgroup动态下拉列表
  5. RUNOOB python练习题4
  6. UML之涉众/参与者(角色/执行者)(Actor)/业务主角(BusinessActor)/业务工人(BusinessWorker)/用户/角色辨析【图解】...
  7. 程序员必备的七个快捷键【一分钟掌握】
  8. C#WinForm开发在选项卡tab中集成加载多个窗体,通过选项卡切换窗体(超详细讲解)
  9. Microsoft Office 2016 简体中文 Vol 版镜像下载(Pro Plus、Visio、Project 下载)
  10. 写给电脑小白的电脑科普
  11. Oracle nlssort()中文排序
  12. SVN入门教程,超简单,30分钟学会!
  13. 卓一电子 智能防雷定时插座 ZYT21时控开关 定时功能设置说明书
  14. Window10系统启动问题——无法启动问题
  15. 赚多多V10自动抢单系统源码_派单连单管理新增设置订单佣金
  16. 【长期更新】日常学习中遇到的知识点
  17. Javaweb实现员工信息管理系统
  18. HTML文字动画,缓慢浮入
  19. 超全!常用的 70 个数据分析网址
  20. Java BMI计算程序

热门文章

  1. 如何调整PDF的页面布局
  2. PCB布线技巧(全)
  3. python xlwt
  4. 【原创】所谓“读心术”的伎俩
  5. 计算机毕业设计android的在线音乐播放器app设计(源码+系统+mysql数据库+Lw文档)
  6. 21个MySQL表设计的经验准则
  7. 新监管新纪元 大浪淘沙始见金——“9·4”政策回顾·行业前瞻
  8. JdbcTemplate 查询数据库 + 具名参数 NamedParameterJdbcTemplate
  9. 正态性检验的R语言实现
  10. python绘制地图线路_python pyecharts绘制地图