前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >总结:使用 RestTemplate 发送HTTP请求

总结:使用 RestTemplate 发送HTTP请求

作者头像
张云飞Vir
发布于 2021-05-18 04:17:10
发布于 2021-05-18 04:17:10
3K00
代码可运行
举报
文章被收录于专栏:写代码和思考写代码和思考
运行总次数:0
代码可运行

1. 背景

一般发送HTTP请求是使用 Apache的HttpClient,它比较灵活。在 spring cloud 中往往提供的 REST 风格的服务。RestTemplate 提供了一种简单便捷的模板类来进行HTTP操作的方式。

或者,根据你的需要可考虑使用org.springframework.web.reactive.client.WebClient 具有更现代API并支持同步,异步和流传输方案。

2.知识

HttpClient 是一个 模板化 的HTTP请求框架,比较适合用调用 REST请求。在 SpringCloud 微服务框架中应用较多。

3. 示例

(1)发送 get 请求

使用getForEntity:发起 get 请求。 无参数的请求方式。

超级简单,见下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String url = "http://your_url";
ResponseEntity<String> result = restTemplate.getForEntity(url,String.class);

使用getForEntity:发起 get 请求。自己拼接参数字符串方式。

这样的方式要使用 map 传递参数。 如果有汉字要注意需要进行 urlencode。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String url = "http://127.0.0.1:8080/login?name={name}";
Map<String,String> map = new HashMap<>();
map.put("name","join");
ResponseEntity<String> result = restTemplate.getForEntity(url,String.class,map);

使用getForEntity:发起 get 请求。先拼接URI对象传参。

先 使用 UriComponents 构建一个对象,再 expand 替换参数实际的值,这样看起来比较清晰。

  • expand(): 替换参数。
  • encode(): 编码,默认使用utf-8。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UriComponents uriComponents = UriComponentsBuilder
.fromUriString("http://example.com/hotels/{hotel}/bookings/{booking}").build();
URI uri = uriComponents.expand("42", "21").encode().toUri();
ResponseEntity<String> result = restTemplate.getForEntity(uri,String.class);

使用getForEntity:对返回的响应内容转换成实体对象

下面参数要传入一个 class , 这里直接传入 User.class 即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String url = "http://127.0.0.1:8080/login?name={name}";
Map<String,String> map = new HashMap<>();
map.put("name","zhang3");
ResponseEntity<User> result = restTemplate.getForEntity(url,User.class,map);

发送带有请求头的get 请求

先构建一个 HttpEntity,构件时传入 header对象,再发送。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String url = "http://127.0.0.1:8080/xxx;
HttpHeaders resultRequestHeader = new HttpHeaders();
resultRequestHeader.add("charset", "UTF-8");
resultRequestHeader.setContentType(MediaType.APPLICATION_JSON);

LinkedMultiValueMap<String, Object> resultParamMap = new LinkedMultiValueMap<>();
 
HttpEntity<String>  resultHttpEntity = new HttpEntity<>(null, resultRequestHeader);
ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.GET,resultHttpEntity,String.class);

(2)发送 PSOT 请求

使用 postForEntity 发送 post 请求。

和 get 方式类似,使用 postForEntity。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String url = "http://127.0.0.1:8080/login";
LinkedMultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
paramMap.add("username", "zhangsan");
paramMap.add("password", "123456");
paramMap.add("randomStr",String.valueOf(System.currentTimeMillis()));
HttpEntity<LinkedMultiValueMap<String, Object>> httpEntity = new HttpEntity<>(paramMap, requestHeaders);
 
ResponseEntity<String> exchange = restTemplate.postForEntity(url, httpEntity, String.class);
 
String resultRemote = exchange.getBody();//得到返回的值

(3)使用 exchange 方法

exchange 方法:先构建 ResponseEntity ,再发请求

执行给定中指定的请求,RequestEntity并以形式返回响应ResponseEntity。通常采用 builder 链式的方式构建一个 RequestEntity,例如: 方法签名:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public <T> ResponseEntity<T> exchange(RequestEntity<?> entity,
                                      Class<T> responseType)
                               throws RestClientException

示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 MyRequest body = ...
 RequestEntity request = RequestEntity
     .post(new URI("https://example.com/foo"))
     .accept(MediaType.APPLICATION_JSON)
     .body(body);
 ResponseEntity<MyResponse> response = template.exchange(request, MyResponse.class);

exchange 方法:构建 RequestEntity ,发送带有泛型的参数请求

方法签名

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public <T> ResponseEntity<T> exchange(RequestEntity<?> entity,
                                      ParameterizedTypeReference<T> responseType)
                               throws RestClientException

见下示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MyRequest body = ...
 RequestEntity request = RequestEntity
     .post(new URI("https://example.com/foo"))
     .accept(MediaType.APPLICATION_JSON)
     .body(body);
 ParameterizedTypeReference<List<MyResponse>> myBean =
     new ParameterizedTypeReference<List<MyResponse>>() {};
 ResponseEntity<List<MyResponse>> response = template.exchange(request, myBean);

exchange 方法: 应对泛型集合

对给定的URI模板执行HTTP方法,将给定的请求实体写入请求,并以形式返回响应ResponseEntity。给定ParameterizedTypeReference用于传递 泛型类型 的实体信息:

ParameterizedTypeReference 一般 用于传递 泛型集合 比如 List<MyBean> 这样的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public <T> ResponseEntity<T> exchange(String url,
                                      HttpMethod method,
                                      @Nullable
                                      HttpEntity<?> requestEntity,
                                      ParameterizedTypeReference<T> responseType,
                                      Object... uriVariables)
                               throws RestClientException

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 ParameterizedTypeReference<List<MyBean>> myBean =
     new ParameterizedTypeReference<List<MyBean>>() {};

 ResponseEntity<List<MyBean>> response =
     template.exchange("https://example.com",HttpMethod.GET, null, myBean);

(4)使用 execute 方法

execute 方法请求

对 URI模板 发起 HTTP方法请求,使用 RequestCallback 做请求的处理和准备。并使用 ResponseExtractor 来处理 “响应结果 ”。

签名:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Nullable
public <T> T execute(String url,
                               HttpMethod method,
                               @Nullable
                               RequestCallback requestCallback,
                               @Nullable
                               ResponseExtractor<T> responseExtractor,
                               Object... uriVariables)
                        throws RestClientException

4.参考:

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解)
RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。
Java_老男孩
2019/12/02
11.4K1
RestTemplate的使用和原理你都烂熟于胸了吗?【享学Spring MVC】
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
YourBatman
2019/09/18
2.2K0
RestTemplate的使用和原理你都烂熟于胸了吗?【享学Spring MVC】
重学springboot系列番外篇之RestTemplate
RestTemplate是执行HTTP请求的同步阻塞式的客户端,它在HTTP客户端库(例如JDK HttpURLConnection,Apache HttpComponents,okHttp等)基础封装了更加简单易用的模板方法API。也就是说RestTemplate是一个封装,底层的实现还是java应用开发中常用的一些HTTP客户端。但是相对于直接使用底层的HTTP客户端库,它的操作更加方便、快捷,能很大程度上提升我们的开发效率。
大忽悠爱学习
2021/12/15
4.6K0
重学springboot系列番外篇之RestTemplate
RestTemplate学习
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
2019/08/29
9570
Spring Data REST 与 Spring RestTemplate 实战详解
这篇分为两部分内容进行介绍(Spring Data REST 和 Spring RestTemplate)。我之前有一篇文章完整的介绍了 HTTP 协议的内容,而这两个工具中一个帮我们完成 Client 的实现,另一个帮我们完成 Server端的实现。 希望大家对 Spring 和 HTTP 之间有个完整的认识,并能够优雅地使用。 RestTemplate 认识 RestTemplate org.springframework.web.client.RestTemplate 位于 spring-web 的核
CSDN技术头条
2018/03/26
5.5K0
Spring Data REST 与 Spring RestTemplate 实战详解
手撸了一个网络请求工具类,开发速度迅速提升了300%
在上一篇文章中,我们详细的介绍了RestTemplate工具类的用法,相比直接使用Apache的HttpClient进行网络传输,采用RestTemplate开发代码确实简化了很多,甚至可以做到傻瓜式操作,但是基于当前的团队人员开发习惯,我们可不可以继续基于RestTemplate再做一层封装呢?以便于操作Http网络请求,更加简单、便捷!
Java极客技术
2022/12/04
8140
SpringBoot使用RestTemplate访问第三方接口
相信大家都知道如何在自己的项目里面调用自己的接口,只需要调用自己项目里面接口特定的URL地址就行了,但是如果是调用其他项目的接口呢,这时候如果是直接调用的话,很明显我们是不能够调用的.肯定是要通过某个工具才能够进行访问的.我们可以通过下面这张图来理解.
萌萌哒的瓤瓤
2021/01/13
3.8K0
SpringBoot使用RestTemplate访问第三方接口
一文吃透接口调用神器RestTemplate
发送 http 请求,估计很多人用过 httpclient 和 okhttp,确实挺好用的,而 Spring web 中的 RestTemplate 和这俩的功能类似,也是用来发送 http 请求的,不过用法上面比前面的 2 位要容易很多。
路人甲Java
2021/11/08
10.3K0
一文吃透接口调用神器RestTemplate
Spring RestTemplate介绍
  上篇文件介绍Eureka服务的文章中,我们介绍到consumer从Eureka中通过LoadBalancerClient获取到服务端地址信息后通过RestTemplate来远程调用服务的场景,本文来具体介绍下RestTemplate的使用
用户4919348
2019/05/30
1.7K0
Java调用外部REST请求的几种方式
1、RestOperations 提供了各种封装方法,非常方便直接将返回转成实体类。
伍六七AI编程
2022/03/23
8280
Spring3 RestTemplate
RestTemplate是执行HTTP请求的同步阻塞式的客户端,它在HTTP客户端库(例如JDK HttpURLConnection,Apache HttpComponents,okHttp等)基础封装了更加简单易用的模板方法API。也就是说RestTemplate是一个封装,底层的实现还是java应用开发中常用的一些HTTP客户端。但是相对于直接使用底层的HTTP客户端库,它的操作更加方便、快捷,能很大程度上提升我们的开发效率。
HLee
2021/04/25
3.2K0
Spring3 RestTemplate
RestTemplate的应用
Spring提供了一种简单便捷的模板类 RestTemplate 来调用 RESTful 接口。它提供了多种便捷访问HTTP服务的方法,能够大大提高客户端的编写效率。
砒霜拌辣椒
2023/08/23
2360
一看就会的Spring的resetTemplate的使用方法
作为一名Java开发者,我们怎么都绕不开调用外部接口的场景,调用的方式要么是通过Http协议来调用,要么是通过RPC协议来调用,通过Http协议调用的话我们就需要用到Http的Api。比较常用的有Apache的HttpClient和原生的HttpURLConnection。这些Api都比较好用,但是我们今天要介绍一种更加好用API,Spring自带的RestTemplate,能力更强,使用更方便。
码农飞哥
2021/08/18
1.8K0
http请求方式-RestTemplate
oktokeep
2024/10/09
800
RestTemplate.exchange各种用法(包括泛型等 --全)
在我们日常开发中,无论是内部服务之间的调用,还是调用第三方服务,都免不了发起Http请求,在Java中发起Http请求常见的方式大致有原生HttpURLConnection、Apache的HttpClient、Spring的RestTemplate等,如果您基于Spring框架,那么强烈推荐使用RestTemplate,理由很简单:非常符合我们发起http请求的习惯,就像使用postman,只需要关心具体的url、header、body等即可,对于繁琐的细节RestTemplate都帮我们安排(封装)的明明白白,无关的细节我们统统不用操心! 尤其是RestTemplate.exchange方法,可以称的上是单靠一招就可以吊打其它方式。。。 所以本文就来详细介绍一下RestTemplate.exchange各种用法,力求覆盖日常开发中的各种场景,Let’s start~~
天罡gg
2022/12/02
6.5K1
RestTemplate.exchange各种用法(包括泛型等 --全)
RestTemplate 用法详解「建议收藏」
上篇文章带大家学习了一下基本的微服务环境搭建,由 provider 提供服务, consumer 通过 DiscoveryClient 先去 eureka 上获取 provider 的服务的地址,获取到地址之后再去调用相关的服务。在服务的调用过程中,使用到了一个工具,叫做 RestTemplate,RestTemplate 是由 Spring 提供的一个 HTTP 请求工具。在上文的案例中,开发者也可以不使用 RestTemplate ,使用 Java 自带的 HttpUrlConnection 或者经典的网络访问框架 HttpClient 也可以完成上文的案例,只是在 Spring 项目中,使用 RestTemplate 显然更方便一些。在传统的项目架构中,因为不涉及到服务之间的调用,大家对 RestTemplate 的使用可能比较少,因此,本文我们就先来带领大家来学习下 RestTemplate 的各种不同用法,只有掌握了这些用法,才能在微服务调用中随心所欲地发送请求。
全栈程序员站长
2022/11/01
3.6K0
Demo直接拿来用:兼容https的"restful外部api调用工具"
关于"Demo拿来直接用" 本系列文章为大家提供常用小工具的Demo 侧重点并非代码如何实现,因为大家都能写 目的是为大家节省开发时间,力求“拿来直接就能用” 用最快的时间完成开发任务 兼容https的"restful外部api调用工具" 01 | 应用场景 在应用内部需要调用外部的api时使用 同时兼容https类型请求 (正常在调用https类型请求时会报以下异常,该工具解决了该问题) 还是老话:方法有很多,效率至上即可。 02 | 拿来吧你 源码分为三部分: 重写S
浩说编程
2021/10/20
1.3K0
Spring Cloud Ribbon负载均衡
Spring Cloud Ribbon负载均衡一、简介二、客户端负载均衡三、RestTemplate详解GET请求POST请求PUT请求DELETE请求
cxuan
2019/06/03
6590
一起学 Spring 之 RestTemplate
在 Java 服务端开发领域里,Spring 是绕不开的话题,尤其是现在微服务概念盛行,Spring Boot 的出现更是给 Spring 注入了新的活力,除此之外还有 Spring Cloud,这些框架让 Spring 技术体系更加丰富。Spring 从 2014 年的 1.0.0 版本迭代到 现在的 5.2.0 M1 版本,紧随着 Java 语言发展,不断引入新的特性和功能。
闻人的技术博客
2019/09/19
1.4K0
一起学 Spring 之 RestTemplate
SpringBoot图文教程17—上手就会 RestTemplate 使用指南「Get Post」「设置请求头」
问个问题:通过Java代码怎么发送Http请求,请求另一个Java程序的Controller方法呢?
鹿老师的Java笔记
2020/03/30
2.7K0
相关推荐
Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验