HTTP-和-WebClient把握-Spring-Boot-RestTemplate-外部接口调用-经过
在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
引用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。这里我们就不再赘述。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。