当前位置:首页 > 数码 > HTTP-和-WebClient把握-Spring-Boot-RestTemplate-外部接口调用-经过

HTTP-和-WebClient把握-Spring-Boot-RestTemplate-外部接口调用-经过

admin8个月前 (04-28)数码38

在SpringBoot中调用外部接口的形式有多种,其中最罕用的是经常使用RestTemplate或许WebClient。以下是一种经常使用RestTemplate的示例,蕴含了具体的形容和实例源代码:

步骤1:参与依赖

确保在pom.xml文件中参与以下依赖,以引入SpringBoot的Web模块:

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

步骤2:创立RestTemplateBean

在SpringBoot运行程序的性能类中,创立一个RestTemplate的Bean,以便能够注入到其余组件中。

importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.client.RestTemplate;@ConfigurationpublicclassConfig{@BeanpublicRestTemplaterestTemplate(){returnnewRestTemplate();}}

步骤3:经常使用RestTemplate调用外部接口

创立一个Service或Controller类,并注入RestTemplate,经常使用它来调用外部接口。

importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importorg.springframework.web.client.RestTemplate;@ServicepublicclassExternalApiService{privatefinalStringapiUrl="https://api.example.com/data";@AutowiredprivateRestTemplaterestTemplate;publicStringfetchDataFromExternalApi(){//动员GET恳求,并失掉照应Stringresponse=restTemplate.getForObject(apiUrl,String.class);//处置照应,可以进后退一步的业务逻辑处置returnresponse;}}

总结:

请留意,最近的Spring版本中介绍经常使用WebClient作为代替打算,由于它提供了更灵敏、照应式的形式来处置HTTP恳求。以下是一个繁难的经常使用WebClient的示例:

importorg.springframework.stereotype.Service;importorg.springframework.web.reactive.function.client.WebClient;@ServicepublicclassExternalApiService{privatefinalStringapiUrl="https://api.example.com/data";privatefinalWebClientwebClient;publicExternalApiService(WebClient.BuilderwebClientBuilder){this.webClient=webClientBuilder.baseUrl(apiUrl).build();}publicStringfetchDataFromExternalApi(){//动员GET恳求,并失掉照应Stringresponse=webClient.get().retrieve().bodyToMono(String.class).block();//处置照应,可以进后退一步的业务逻辑处置returnresponse;}}

上述示例中,咱们经常使用了WebClient.Builder来构建WebClient实例,而后经常使用链式调用动员GET恳求。这种形式愈加灵敏,并且支持照应式编程。选用经常使用RestTemplate还是WebClient取决于团体偏好和名目需求。


Springboot引用jackson-dataformat-xml后如何返回json

RestTemplate

引用jackson-dataformat-xml后,原本返回json的接口全部返回了xml,除了前端调用时因有加特定的请求头而可以返回json外,尤其是后端服务间调用时全部返回了xml,导致json反序列化失败。 让xml解析顺序重新排序 注意这里千万不能再加个@EnableWebMvc,会导致之前注入的Converter全部失效,参照 这里 然而这并不一直能解决问题,实际中发现有些接口能调整回来,有些不能,原因大概是用谷歌浏览器访问时,它的Accept如果没有指定,默认xml会排在前面申请;还有服务间的通信,由于之前没有指定还是返回了xml。 服务间通信是直接使用RestTemplate的,直接new,为了方便管理,改为注入一个写了Accept头的对象。 实现一个ClientHttpRequestInterceptor,便于加入Header配置 注入RestTemplate 顺便提一句,@ResqustMapping(produces=application/json) 也是可以的,然而太麻烦,反正前端在请求时会指定content-type,这个似乎会暗示返回结果,因此也能稳定返回json格式 我这边发现配置Media解析顺序用处不大,尤其是用谷歌浏览器时,它的Accept拿到就是xml排前面的,因此下面的设置没什么用

SpringCloud升级之路2020.0.x版-29.SC OpenFeign 的解析(2)

在使用云原生的很多微服务中,比较小规模的可能直接依靠云服务中的负载均衡器进行内部域名与服务映射,通过 健康 检查接口判断实例 健康 状态,然后直接使用 OpenFeign 生成对应域名的 Feign Client。Spring Cloud 生态中,对 OpenFeign 进行了封装,其中的 Feign Client 的各个组件,也是做了一定的定制化,可以实现在 OpenFeign Client 中集成服务发现与负载均衡。在此基础上,我们还结合了 Resilience4J 组件,实现了微服务实例级别的线程隔离,微服务方法级别的断路器以及重试。

我们先来分析下 Spring Cloud OpenFeign

Spring Cloud 中的任何组件,都是基于 Spring Boot 而实现的。由于 Spring Boot 中已经有了 HTTP 编码解码器,就可以不用单独给 OpenFeign 单独再实现 HTTP 编码解码器了,而是考虑将 OpenFeign 的编码解码器接口用 Spring Boot 的 HTTP 编码解码器实现。

在 FeignClientsConfiguration 中,提供了默认的实现:

通过源码可以看出,默认的 Decoder 是经过几层包装的 Decoder,分别包括:

传入 SpringDecoder 的 HttpMessageConverters 对象,是 spring-web 的所有 HttpMessageConverter 集合。HttpMessageConverter 是 spring-web 中对于 HTTP 请求和响应的 body 进行编码解码的工具。其接口结构是:

spring boot 内置了很多 HttpMessageConverter,我们也可以实现自己的 HttpMessageConverter,去实现我们自定义 MediaType,例如我们这里定义一个 :

之后,与前面类似,将其配置到 spring boot 兼容 MVC 配置中:

编写 Controller,测试:

使用 postman 类似的工具,指定 HTTP 请求头:

Body 是:

请求后,就会走到 CustomizedHttpMessageConverter 的 read 解析成 Student 对象,之后响应的 student 也会被 CustomizedHttpMessageConverter 的 write 写入响应 Body

由此可见, 由于 SpringEncoder 的存在,我们可以复用 Spring 内置的 HttpMessageConverter,同时也能扩展自定义我们自己的 HttpMessageConverter,非常方便 。

ResponseEntityDecoder 的代码比较简单,实现的效果就是解码的时候,忽略 HttpEntity 这个 spring-web 对于 HTTP 响应的包装类:

这个其实为了和 RestTemplate 的响应兼容,RestTemplate 可以返回 HttpEntity,但是底层 HTTP 请求返回的 body 其实并没有包装这个类型。

同理,JDK 中的 Optional 包装类,也需要做同样的事情,这个就是通过 OptionalDecoder 实现的。

SpringEncoder 编码器也非常简单,也是基于 spring 中的 HttpMessageConverter。这里我们就不再赘述。

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: SpringBoot

“HTTP-和-WebClient把握-Spring-Boot-RestTemplate-外部接口调用-经过” 的相关文章

概念-Spring-AOP-实现原理和应用-中的 (概念股股票)

概念-Spring-AOP-实现原理和应用-中的 (概念股股票)

什么是AOP? AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,其主要目的是将横切关注点(cross-cutting concern)从主要业务...

如何在Spring名目中顺利性能MP-MyBatis (如何在springer上下载文献)

如何在Spring名目中顺利性能MP-MyBatis (如何在springer上下载文献)

在Spring名目中集成MP,须要启动以下性能: 1.引入依赖:在名目标pom.xml文件中参与MP相关依赖,例如:```xml<dependency><groupId&g...

事务传播行为-Spring-七种类型一览 (spring事务传播行为)

事务传播行为-Spring-七种类型一览 (spring事务传播行为)

简介 Spring 事务传播性是指在 Spring 环境中,当多个包含事务的方法嵌套调用时,每个事务方法如何处理事务上下文中的提交或回滚行为。 传播性行为 Spring 中定义了 7 种事...

b-b-核心原理拆解与源码分析-2.0-Spring-Boot-深度实践 (核心b类期刊有哪些)

b-b-核心原理拆解与源码分析-2.0-Spring-Boot-深度实践 (核心b类期刊有哪些)

SpringBoot是一个基于Spring的轻量级框架,它简化了Spring应用程序的创建过程,使得开发者能够快速搭建一个可运行的应用程序。随着SpringBoot2.0版本的发布,其功能和性能得...

极致便当与卓越容错-Topic-Spring-重试-成功-运用-Kafka (极致餐是什么意思)

极致便当与卓越容错-Topic-Spring-重试-成功-运用-Kafka (极致餐是什么意思)

概述 Kafka的弱小性能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条信息的值。可以智能或手动参与该值。假设咱们因为失误而不可处置信息并想重试,咱们可以选用...

Spring-Webflux-Boot-虚构线程性能逊色于-深化比较 (springboot)

Spring-Webflux-Boot-虚构线程性能逊色于-深化比较 (springboot)

早上看到一篇关于SpringBoot虚构线程和Webflux性能对比的文章,感觉还不错。内容较长,抓重点给大家引见一下这篇文章的外围内容,繁难大家极速浏览。 测试场景 作者驳回了一个尽...

揭秘-的暗藏技艺-AOP-从概念到实用场景-Spring (神秘丂丂是什么意思)

揭秘-的暗藏技艺-AOP-从概念到实用场景-Spring (神秘丂丂是什么意思)

环境:Spring5.3.23 1.引见 当天看Spring文档看到这么一个常识点《ControlFlowPointcuts》都不好翻译 官网原文: Springcontr...

使用Spring-Cloud和Java构建强大而灵活的微服务-十个实践案例 (使用spring框架的好处是什么)

使用Spring-Cloud和Java构建强大而灵活的微服务-十个实践案例 (使用spring框架的好处是什么)

在使用构建微服务时,许多人认为只要学习一些微服务设计模式就足够了,比如 CQRS、SAGA 或每个微服务一个数据库。虽然这是正确的,但同时学习一些通用的最佳实践也是很有意义的。本文分享一些最佳实践...