Spring RestTemplate中几种常见的请求方式

Spring RestTemplate中几种常见的请求方式在 SpringCloud 中服务的发现与消费一文中 当我们从服务消费端去调用服务提供者的服务的时候 使用了一个很好用的对象 叫做 RestTemplate 当时我们只使用了 RestTemplate 中最简单的一个功能 getForEntity 发起了一个 get 请求去调用服务端的数据 同时 我们还通过配置 LoadBalanced 注解开启客户端负载均衡 RestTemplate 的功能不可谓不强大 那么今天我

关注公众号【江南一点雨】,专注于 Spring Boot+微服务以及前后端分离等全栈技术,定期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货!

Spring RestTemplate中几种常见的请求方式
在Spring Cloud中服务的发现与消费一文中,当我们从服务消费端去调用服务提供者的服务的时候,使用了一个很好用的对象,叫做RestTemplate,当时我们只使用了RestTemplate中最简单的一个功能getForEntity发起了一个get请求去调用服务端的数据,同时,我们还通过配置@LoadBalanced注解开启客户端负载均衡,RestTemplate的功能不可谓不强大,那么今天我们就来详细的看一下RestTemplate中几种常见请求方法的使用。


本文是Spring Cloud系列的第六篇文章,了解前五篇文章的内容有助于更好的理解本文:


本文主要从以下四个方面来看RestTemplate的使用:

  • GET请求
  • POST请求
  • PUT请求
  • DELETE请求

OK,开始吧。

环境搭建

这里写图片描述

其中commons是一个公共模块,是一个普通的JavaSE工程,我们一会主要将实体类写在这个模块中,provider和consumer是两个spring boot项目,provider将扮演服务提供者的角色,consumer扮演服务消费者的角色。

commons模块主要用来提供实体类,内容如下:

这里写图片描述

然后在provider和consumer模块中添加对commons的依赖,依赖代码如下:

 
     
     
       org.sang 
      
     
       commons 
      
     
       1.0-SNAPSHOT 
      
     

provider和consumer的开发小伙伴们可以参考使用Spring Cloud搭建服务注册中心和Spring Cloud中服务的发现与消费,我这里就不再赘述了。下文中我只列出provider和consumer的核心代码,文末可以下载源码。

GET请求

在RestTemplate中,发送一个GET请求,我们可以通过如下两种方式:

第一种:getForEntity

getForEntity方法的返回值是一个ResponseEntity
ResponseEntity
是Spring对HTTP请求响应的封装,包括了几个重要的元素,如响应码、contentType、contentLength、响应消息体等。比如下面一个例子:

@RequestMapping("/gethello") public String getHello() { ResponseEntity 
    
      responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class); String body = responseEntity.getBody(); HttpStatus statusCode = responseEntity.getStatusCode(); int statusCodeValue = responseEntity.getStatusCodeValue(); HttpHeaders headers = responseEntity.getHeaders(); StringBuffer result = new StringBuffer(); result.append("responseEntity.getBody():").append(body).append(" 
     
") .append("responseEntity.getStatusCode():").append(statusCode).append("
") .append("responseEntity.getStatusCodeValue():").append(statusCodeValue).append("
") .append("responseEntity.getHeaders():").append(headers).append("
"); return result.toString(); }

关于这段代码,我说如下几点:

  • getForEntity的第一个参数为我要调用的服务的地址,这里我调用了服务提供者提供的/hello接口,注意这里是通过服务名调用而不是服务地址,如果写成服务地址就没法实现客户端负载均衡了。
  • getForEntity第二个参数String.class表示我希望返回的body类型是String
  • 拿到返回结果之后,将返回结果遍历打印出来

最终显示结果如下:

这里写图片描述

有时候我在调用服务提供者提供的接口时,可能需要传递参数,有两种不同的方式,如下:

@RequestMapping("/sayhello") public String sayHello() { ResponseEntity 
    
      responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/sayhello?name={1}", String.class, "张三"); return responseEntity.getBody(); } @RequestMapping("/sayhello2") public String sayHello2() { Map 
     
       map = new HashMap<>(); map.put("name", "李四"); ResponseEntity 
      
        responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/sayhello?name={name}", String.class, map); return responseEntity.getBody(); } 
       
      
    
  • 可以用一个数字做占位符,最后是一个可变长度的参数,来一一替换前面的占位符
  • 也可以前面使用name={name}这种形式,最后一个参数是一个map,map的key即为前边占位符的名字,map的value为参数值

第一个调用地址也可以是一个URI而不是字符串,这个时候我们构建一个URI即可,参数神马的都包含在URI中了,如下:

@RequestMapping("/sayhello3") public String sayHello3() { UriComponents uriComponents = UriComponentsBuilder.fromUriString("http://HELLO-SERVICE/sayhello?name={name}").build().expand("王五").encode(); URI uri = uriComponents.toUri(); ResponseEntity 
    
      responseEntity = restTemplate.getForEntity(uri, String.class); return responseEntity.getBody(); } 
    

通过Spring中提供的UriComponents来构建Uri即可。

当然,服务提供者不仅可以返回String,也可以返回一个自定义类型的对象,比如我的服务提供者中有如下方法:

@RequestMapping(value = "/getbook1", method = RequestMethod.GET) public Book book1() { return new Book("三国演义", 90, "罗贯中", "花城出版社"); } 

对于该方法我可以在服务消费者中通过如下方式来调用:

@RequestMapping("/book1") public Book book1() { ResponseEntity 
    
      responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/getbook1", Book.class); return responseEntity.getBody(); } 
    

运行结果如下:

这里写图片描述

第二种:getForObject

getForObject函数实际上是对getForEntity函数的进一步封装,如果你只关注返回的消息体的内容,对其他信息都不关注,此时可以使用getForObject,举一个简单的例子,如下:

@RequestMapping("/book2") public Book book2() { Book book = restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class); return book; } 

getForObject也有几个重载方法,如下:

这里写图片描述

这几个重载方法参数的含义和getForEntity一致,我就不再赘述了。

POST请求

在RestTemplate中,POST请求可以通过如下三个方法来发起:

第一种:postForEntity

该方法和get请求中的getForEntity方法类似,如下例子:

@RequestMapping("/book3") public Book book3() { Book book = new Book(); book.setName("红楼梦"); ResponseEntity 
    
      responseEntity = restTemplate.postForEntity("http://HELLO-SERVICE/getbook2", book, Book.class); return responseEntity.getBody(); } 
    
  • 方法的第一参数表示要调用的服务的地址
  • 方法的第二个参数表示上传的参数
  • 方法的第三个参数表示返回的消息体的数据类型

我这里创建了一个Book对象,这个Book对象只有name属性有值,将之传递到服务提供者那里去,服务提供者代码如下:

@RequestMapping(value = "/getbook2", method = RequestMethod.POST) public Book book2(@RequestBody Book book) { System.out.println(book.getName()); book.setPrice(33); book.setAuthor("曹雪芹"); book.setPublisher("人民文学出版社"); return book; } 

服务提供者接收到服务消费者传来的参数book,给其他属性设置上值再返回,调用结果如下:

这里写图片描述

postForEntity的其他重载方法如下:

这里写图片描述

这些方法的参数含义和getForEntity参数的含义一致,不再赘述。

第二种:postForObject

如果你只关注,返回的消息体,可以直接使用postForObject。用法和getForObject一致。

第三种:postForLocation

postForLocation也是提交新资源,提交成功之后,返回新资源的URI,postForLocation的参数和前面两种的参数基本一致,只不过该方法的返回值为Uri,这个只需要服务提供者返回一个Uri即可,该Uri表示新资源的位置。

PUT请求

在RestTemplate中,PUT请求可以通过put方法调用,put方法的参数和前面介绍的postForEntity方法的参数基本一致,只是put方法没有返回值而已。举一个简单的例子,如下:

@RequestMapping("/put") public void put() { Book book = new Book(); book.setName("红楼梦"); restTemplate.put("http://HELLO-SERVICE/getbook3/{1}", book, 99); } 

book对象是我要提交的参数,最后的99用来替换前面的占位符{1}

DELETE请求

delete请求我们可以通过delete方法调用来实现,如下例子:

@RequestMapping("/delete") public void delete() { restTemplate.delete("http://HELLO-SERVICE/getbook4/{1}", 100); } 

delete方法也有几个重载的方法,不过重载的参数和前面基本一致,不赘述。

OK,以上就是我们对RestTemplate能够发送的请求的一个详细介绍,有问题欢迎留言讨论。

本文案例地址:https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate

更多JavaEE资料请关注公众号:

这里写图片描述

以上。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/204289.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午8:37
下一篇 2026年3月19日 下午8:37


相关推荐

  • obs录制黑屏怎么解决_obs窗口捕获黑屏

    obs录制黑屏怎么解决_obs窗口捕获黑屏00.目录文章目录00.目录01.问题描述02.问题分析03.问题解决04.成功测试01.问题描述打开OBS后,新建场景、新建显示器捕获后,黑屏没有显示,即使点击开始录制,然后结束录制后,录制的视频仍然是黑屏。02.问题分析安装包是从官网下载的,安装过程没有报错,启动过程也没有报错,但是却捕捉不到显示器中的图像。首先考虑的是软件兼容性的问题,但是在我将兼容性设置成”W…

    2022年4月19日
    112
  • Oracle用户被锁原因及办法

    Oracle用户被锁原因及办法在登陆时被告知test用户被锁1、用dba角色的用户登陆,进行解锁,先设置具体时间格式,以便查看具体时间SQL>altersessionsetnls_

    2021年12月27日
    52
  • 科大讯飞2025上半年财报亮点:营收破百亿,星火大模型技术再升级

    科大讯飞2025上半年财报亮点:营收破百亿,星火大模型技术再升级

    2026年3月14日
    2
  • java getmapping(_@getMapping与@postMapping详解「建议收藏」

    首先要了解一下@RequestMapping注解。@RequestMapping用于映射url到控制器类的一个特定处理程序方法。可用于方法或者类上面。也就是可以通过url找到对应的方法。@RequestMapping有8个属性。value:指定请求的实际地址。method:指定请求的method类型(GET,POST,PUT,DELETE)等。consumes:指定处理请求的提交内容类型(Cont…

    2022年4月9日
    347
  • Centos下利用expect自动备份mysql数据库

    Centos下利用expect自动备份mysql数据库Centos 下利用 expect 自动备份 mysql 数据库 1 服务器安装 expectyumins yexpect2 数据库备份 mysql 的 bash 脚本 backup db sh 数据库的配置按自己的实际情况设置 bin bashBakDatab currTime date Y m d T currTime date Y m d

    2026年3月18日
    2
  • linux shell 脚本 pdf,Shell脚本学习指南 中文PDF版

    linux shell 脚本 pdf,Shell脚本学习指南 中文PDF版Shell 脚本学习指南 将告诉你这些有关 UNIX 主流工具的知识 除此之外 Shell 脚本学习指南 还会帮助你解决 UNIX 命令与标准的差异 作者熟知 UNIx 程序使用的基本技巧与操作上细微的差异 他们不但会告诉你如何构建一个绝佳的脚本 还会教你如何避免落入让你功亏一篑的陷阱 有了 Shell 脚本学习指南 你可以节省很多力气 我们要学习的不只是如何写出有用的 Shell 脚本 你还得了解如何迅速 确实

    2026年3月19日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号