Springboot RestTemplate 服务里发送HTTP请求及几种用法的介绍
【摘要】 RestTemplate与REST资源交互的方法涵盖了HTTP请求方法,包括get, post, put, delete。
在微服务如此流行的当下,专门为某项功能开发模块作为另一项功能的构建块就变得异常重要。假设我们的服务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."
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,返回值的类型和包含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方法,返回一个从相应体映射得到的对象。
该方法可以对指定的URI模板执行请求的HTTP方法,用RequestCallback准备请求,并用ResponseExtractor读取响应,最后返回一个arbitrary对象(这里有个困惑,不知道怎么翻译才准确;根据英文定义,“An arbitrary object has those properties common to the individual objects in its range”即一个对象具有其范围内各个对象所共有性质的属性;物以类聚的感觉)。
官方对该函数的解释如下:
首先是需要5个参数:url,指定的HTTP方法(比如POST, GET),功能性的接口RequestCallback(准备请求的对象;可以是null),从响应消息里提取返回值的对象(可以是null)和扩展模板的变量 以及 最后会返回T。
当然该函数的参数也可以是"url,指定的HTTP方法(比如POST, GET),功能性的接口RequestCallback(准备请求的对象;可以是null),从响应消息里提取返回值的对象(可以是null)和包含uri模板值的map" / "URI格式的url,指定的HTTP方法(比如POST, GET),功能性的接口RequestCallback(准备请求的对象;可以是null),从响应消息里提取返回值的对象(可以是null)"。
【需要注意的地方】
1.url里面要把http/https写上,不然会报错;浏览器地址会帮我们自动补全,这里url变量可不会了
2.解决中文乱码的问题:.setContentType(MediaType.APPLICATION_JSON_UTF8),针对HttpHeaders
3.getForEntity() 返回的是HttpEntity<String>,如果我们需要的是里面的内容,我们需要HttpEntity<String>.getBody()来获取里面的字符串 或则 直接就用getForObject()
4.URL是URI的一个子集。 在《HTTP权威指南》一书中,对于URI的定义是:统一资源标识符;对于URL的定义是:统一资源定位符。 二者的区别在于,URI表示请求服务器的路径,定义这么一个资源。 而URL同时说明要如何访问这个资源(http://)
5.一个arbitrary对象(这里有个困惑,不知道怎么翻译才准确;根据英文定义,“An arbitrary object has those properties common to the individual objects in its range”即一个对象具有其范围内各个对象所共有性质的属性;物以类聚的感觉。)。
【参考资料】
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)