4种Springboot RestTemplate 服务里发送HTTP请求用法

在微服务如此流行的当下,专门为某项功能开发模块作为另一项功能的构建块就变得异常重要。假设我们的服务A是调用某个API接口,服务B则专门用来校验用户是否有权限,那么知道如何在服务A发送http请求去调用服务B的接口就很必要。

如果刚好我们的项目是用Java开发的,那么RestTemplate就是我们需要的可以提供便捷访问远程Http服务方法的类。我们先去官网看下RestTemplate类是在哪个包下:

可以看到是在spring框架网页客户端下,官网对它的介绍:

"Synchronous client to perform HTTP requests, exposing a simple, template method API over underlying HTTP client libraries such as the JDK HttpURLConnection, Apache HttpComponents, and others.

The RestTemplate offers templates for common scenarios by HTTP method, in addition to the generalized exchange and execute methods that support of less frequent cases."

翻译过来就是同步客户端来执行HTTP请求,暴露一个简单的模板方法API给底层的HTTP客户端库比如JDK HttpURLConnection、Apache HttpComponents。

RestTemplate通过HTTP方法为常见的场景提供了模板,除此之外,还提供了通用的交换和执行方法来支持不太常见的情况。

【如何创建?】

因为RestTemplate是Spring的封装;我们先去pom.xml文件里引入springboot starter web依赖,内含spring-web-X.X.X.RELEASE.jar包:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

再去官网看看构建的介绍:

我们可以用官网给的这三种方式来创建RestTemplate。一般来说我们用第一种方式就可以了:

RestTemplate restTemplate = new RestTemplate();

在这个创建过程,RestTemplate默认使用HttpMessageConverter实例将HTTP消息转换成POJO(Plain Ordinary Java Object,即普通的没有使用Entity Beans的Java 对象)或则从POJO转换成HTTP消息。

RestTemplate与REST资源交互的方法涵盖了HTTP请求方法,包括get, post, put, delete。

【Get请求】

在RestTemplate里,有两种方式可以发送Get请求:

1.getForEntity(),发送HTTP GET请求,返回ResponseEntity包含相应体所映射成的对象。官方对该函数的解释如下:

首先是需要三个参数:url(要调用的服务的地址),返回值的类型和包含uri模板值的map 以及 最后会返回ResponseEntity<T>(是Spring对HTTP请求相应的封装,包含了几个重要的元素比如响应码,内容类型,内容长度和响应消息体)。

当然该函数的参数也可以是"url,返回值的类型,扩展模板的变量" / "url,返回值的类型"。

举个例子,我下面用的参数就是"url,返回值的类型,扩展模板的变量":

String accessToken = "fakeAT";
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForEntity("http://127.0.0.1:8880/getUserInfoById?accessToken={at}",
    String.class, accessToken).getBody();

getBody()可以得到ResponseEntity<T>里面的响应消息体。

2.getForObject(),发送HTTP GET请求,返回映射的对象。官方对该函数的解释如下:

该方法也是需要三个参数:url,返回值的类型和包含uri模板值的map 以及 最后会返回T。

当然该函数的参数也可以是"url,返回值的类型,扩展模板的变量" / "url,返回值的类型"。

最后返回的T 实际上是对上一种方法返回的值ResponseEntity<T>的进一步封装,返回的是响应消息体里面的内容。

【Post请求】

在RestTemplate里,有三种方式可以发送Post请求:

1.postForEntity(),发送HTTP POST请求,返回ResponseEntity包含相应体所映射成的对象。官方对该函数的解释如下:

首先是需要三个参数:url,需要POST上去的对象(可以是null) 和扩展模板的变量 以及 最后会返回ResponseEntity<T>。

当然该函数的参数也可以是"url,需要POST上去的对象(可以是null),响应消息的类型,包含uri模板值的map" / "url,需要POST上去的对象(可以是null),响应消息的类型"。

2.postForObject(),发送HTTP POST请求,返回映射的对象。官方对该函数的解释如下:

首先是需要三个参数:url,需要POST上去的对象(可以是null) 和扩展模板的变量 以及 最后会返回ResponseEntity<T>。

当然该函数的参数也可以是"url,需要POST上去的对象(可以是null),响应消息的类型,包含uri模板值的map" / "url,需要POST上去的对象(可以是null),响应消息的类型"。

3.postForLocation(),发送HTTP POST请求,返回的是URI(提交POST之后,新资源的URI链接)。官方对该函数的解释如下:

首先是需要三个参数:url,需要POST上去的对象(可以是null) 和扩展模板的变量 以及 最后会返回URL(提交POST之后,新资源的URI链接)。

当然该函数的参数也可以是"url,需要POST上去的对象(可以是null),响应消息的类型,包含uri模板值的map" / "url,需要POST上去的对象(可以是null)"。

【Put请求】

put和post作用类似,只是后一个请求会把前一个请求覆盖,所以会被用来更改资源,POST则是用来增加资源。

在RestTemplate里,有1种方式可以发送Put请求:

1.put(),发送HTTP PUT请求,是void函数不返回内容。官方对该函数的解释如下:

首先是需要三个参数:url,需要PUT上去的对象(可以是null) 和扩展模板的变量,最后不会返回什么。做的事就是更改需要PUT上去的对象至URL指定的资源。

当然该函数的参数也可以是"url,需要PUT上去的对象(可以是null),包含uri模板值的map" / "url,需要PUT上去的对象(可以是null)"。

【Delete请求】

在RestTemplate里,有1种方式可以发送Delete请求:

1.delete(),发送HTTP DELETE请求,是void函数不返回内容。官方对该函数的解释如下:

首先是需要2个参数:url和扩展模板的变量,最后不会返回什么。做的事就是直接删除URL指定的资源。

当然该函数的参数也可以是"url,包含uri模板值的map" / "url"。

【Exchange方法和Execute方法】

1.exchange(),在URL上执行特定的HTTP方法,返回从响应体中映射得到的包含对象的ResponseEntity。

该方法可以指定请求的HTTP类型。对指定的URI模板执行HTTP方法,把指定的请求实体写入请求,并返回ResponseEntity响应。

官方对该函数的解释如下:

首先是需要5个参数:url,指定的HTTP方法(比如POST, GET),需要写入请求的实体(头部和主体 或 头部 或 主体,也可以是null) ,响应消息的类型和扩展模板的变量 以及 最后会返回ResponseEntity<T>。

当然该函数的参数也可以是"url,指定的HTTP方法(比如POST, GET),需要写入请求的实体(头部和主体 或 头部 或 主体,也可以是null) ,响应消息的类型,包含uri模板值的map" / "URI格式的url,指定的HTTP方法(比如POST, GET),需要写入请求的实体(头部和主体 或 头部 或 主体,也可以是null) ,响应消息的类型" / "url,指定的HTTP方法(比如POST, GET),需要写入请求的实体(头部和主体 或 头部 或 主体,也可以是null) ,响应消息的类型-ParameterizedTypeReference<T>,扩展模板的变量" / "url,指定的HTTP方法(比如POST, GET),需要写入请求的实体(头部和主体 或 头部 或 主体,也可以是null) ,响应消息的类型-ParameterizedTypeReference<T>,包含uri模板值的map" / "URI格式的url,指定的HTTP方法(比如POST, GET),需要写入请求的实体(头部和主体 或 头部 或 主体,也可以是null) ,响应消息的类型-ParameterizedTypeReference<T>" / "需要写入请求的实体(头部和主体 或 头部 或 主体,不可以是null), 响应消息的类型" / "需要写入请求的实体(头部和主体 或 头部 或 主体,不可以是null), 响应消息的类型-ParameterizedTypeReference<T>"。

2.execute(),在URL上执行特定的HTTP方法,返回一个从相应体映射得到的对象。

展开阅读全文

本文系作者在时代Java发表,未经许可,不得转载。

如有侵权,请联系nowjava@qq.com删除。

编辑于

关注时代Java

关注时代Java