关于@RequestLine的使用及配置
作者:会飞的海码 发布时间:2023-09-23 20:52:19
@RequestLine的使用及配置
@RequestLine与其它请求不同,只需要简单写请求方式和路径就能达到请求其它服务的目的。
@FeignClient(value = "feign-server",configuration = FeignConfig.class) //需要一个配置文件
public interface TestService {
@RequestLine("POST /feign/test") //对应请求方式和路径
String feign(@RequestBody UserDO userDO);
}
@EnableFeignClients
@SpringBootConfiguration
public class FeignConfig {
@Bean
public Contract contract(){
return new feign.Contract.Default();
}
}
自定义配置feignClient并使用@RequestLine问题
之前在项目里请求三方服务时,使用的是restTemplate,其在组装参数上略显麻烦,其实我们可以使用openFeign自动的组件去请求三方服务,实现更加优雅
步骤
依赖导入这些就不说了,直接进入正题
1. 定义请求接口
其写法和@FeignClient类似,但要使用来自于openFeign的核心注解@RequestLine,而不是来自MVC的注解@PostMapping、@GetMapping。
public interface DhlApi {
/**
* 查询轨迹
* @param url
* @return
*/
@RequestLine("GET {url}")
@Headers({
"Content-Type: application/json",
})
DhlActiveQueryResponse queryTrack(@Param("url") String url);
}
2. 定义配置文件,配置请求接口
@Configuration
public class TestFeignConfig {
// 获取配置文件,自己用的是apollo
@ApolloJsonValue("${test.api}")
private TestISVInfo testIsvInfo;
@Bean
public TestISVInfo testIsvApi() throws Exception {
return Feign.builder()
.client(client())
.encoder(new FastJsonEncoder())
.decoder(new FastJsonDecoder())
// 连接超时30秒,读取超时60秒
.options(new Request.Options(30 * 1000, 60 * 1000))
// 配置日志
.logger(new Slf4jLogger(TestFeignConfig.class))
// 发生IO异常重试5次,每次重试最小间隔100ms,最大间隔1s,随着重试次数递增
.retryer(new Retryer.Default())
.logLevel(Logger.Level.FULL)
// 注册feign
.target(TestIsv.class, testIsvInfo.getDomainUrl());
}
private Client client() throws Exception {
// 信任策略,设置为无条件信任
TrustStrategy acceptingTrustStrategy = (cert, authType) -> true;
// 设置ssl配置,由于我们采用无条件信任,所以也不需要加载证书
SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();
// 使用NoopHostnameVerifier关闭ssl的校验
SSLConnectionSocketFactory sslScoketFactory = new SSLConnectionSocketFactory(sslContext,
NoopHostnameVerifier.INSTANCE);
Registry<ConnectionSocketFactory> socketFactoryRegistry =
RegistryBuilder.<ConnectionSocketFactory>create()
.register("https", sslScoketFactory)
.register("http", new PlainConnectionSocketFactory())
.build();
PoolingHttpClientConnectionManager connectionManager =
new PoolingHttpClientConnectionManager(socketFactoryRegistry);
CloseableHttpClient httpClient = HttpClients
.custom()
.setMaxConnTotal(20)
.setMaxConnPerRoute(20)
.setSSLSocketFactory(sslScoketFactory)
.evictExpiredConnections()
.evictIdleConnections(20, TimeUnit.SECONDS)
.setConnectionManager(connectionManager).build();
return new ApacheHttpClient(httpClient);
}
}
结束!就这么简单。
为什么用的是@RequestLine
这和open-feign的Contract设计有关系,Contract是一个注解解析接口,它决定了接口可以使用什么注解转换到http请求。open-feign在使用@FeignClient的情况下,使用的是SpringMvcContract,它使得被@FeignClient修饰的接口,可以使用@GetMapping,@PostMapping等Spring Mvc注解。
如果我们要使用@RequestLine,则需要替换open-Feign的MVC解析器,像这样
// 在feign上写上配置
@FeignClient(name = "test-center", configuration = TestFeignConfig .class)
// 配置类
@Configuration
public class TestFeignConfig {
// 配置feign的注释解析器为feign默认解析器而不是mvc解析器
@Bean
public Contract feignContract() {
return new feign.Contract.Default();
}
}
如果我们不单独配置,则会使用FeignClientsConfiguration中默认配置的SpringMvcContract。
@Bean
@ConditionalOnMissingBean
public Contract feignContract(ConversionService feignConversionService) {
return new SpringMvcContract(this.parameterProcessors, feignConversionService);
}
那为什么我们通过@Bean形式注册的feign客户端就能直接使用@RequestLine呢。因为@Bean形式注册的feign客户端不会使用这个配置,而是使用open-feign的默认Contract
打开这个类,我们可以看到它的描述,它的作用可以分为两个:
定义哪些注解在feign接口上是有校的
定义接口的动作
它的processAnnotationOnMethod(MethodMetadata,Annotation, Method)方法,作用就是解析在feign接口上的注解,并转化为发送http请求需要的数据。
方法代码:
该类的该方法,只会处理@Body、@RequestLine和@Header 3个注解,如果不是的话,会直接跳过。 针对@RequestLIne:
获取RequstLine的value,使用正则表达式判断值是否是“GET xxxx”这类的形式,不是就报错。解析到之后,获得方法和uri设置进RequestTemplate中针对@Body
将@Body中的值塞到RequestTemplate的body中针对@Headers
获取@Header中的值,进行解析,并放入RequestTemplate的Header中
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
来源:https://blog.csdn.net/qq_43939757/article/details/88663169


猜你喜欢
- 本文实例讲述了C#中异步回调函数用法。分享给大家供大家参考。具体如下:static void Main(string[] args){ Fu
- 单线程实现文件分割在老的FAT32文件系统中,最大的单个文件大小必须保存在4G内,对于经常看电影的我这个是不能允许的。不过现在Windows
- 使用异步包(推荐)async包由 Dart 编程语言的作者开发和发布。它提供了dart:async风格的实用程序来增强异步计算。可以帮助我们
- 1.前提:已安装JDK14,可以到jdk官网下载,或加QQ群835259695,快速免费下载2.不说没用的直接上jdk14环境下的jpack
- 什么是注解?对于很多初次接触的开发者来说应该都有这个疑问?Annontation是Java5开始引入的新特征,中文名称叫注解。它提供了一种安
- BASE64 编码是一种常用的字符编码,在很多地方都会用到。但base64不是安全领域下的加密解密算法。能起到安全作用的效果很差,而且很容易
- 前言安卓6.0之后,一些敏感权限需要进行动态请求,虽说编写请求授权代码并不难,但是每次一需要权限就需要在视图中添加一段代码,严重影响代码美观
- SLF4J是一个日志框架抽象层,底下绑定具体的日志框架,比如说Log4J,Logback,Java Logging API等。SLF4J也有
- 最近碰到这个问题,在使用spring提供的JpaTemplate进行查询时,如果数据量超过100 条,查询效率就会明显降低。由于开始时使用J
- 在日常开发过程中时常需要用到设计模式,但是设计模式有23种,如何将这些设计模式了然于胸并且能在实际开发过程中应用得得心应手呢?和我一起跟着《
- 条码的应用已深入生活和工作的方方面面。在处理条码时,常需要和各种文档格式相结合。当需要在文档中插入、编辑或者删除条码时,可借助于一些专业的类
- 1)new 运算符:用于创建对象和调用构造函数。这种大家都比较熟悉,没什么好说的了。2)new 修饰符:在用作修饰符时,new 关键字可以显
- Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全
- 前言在spring cloud的项目中用到了feign组件,简单配置过后即可完成请求的调用。又因为有向请求添加Header头的需求,查阅了官
- 本文介绍了android沉浸式状态栏,分享给大家,希望对大家有帮助一、概述现在主流的App设计风格很多都用到了Materail Design
- 目录1、Android如何动态更换桌面图标1.1使用场景1.2知识点1.3使用Activity-alias2、巨坑2.1App的覆盖2.2桌
- 1.使用response对象提供的sendRedirect()方法可以将网页重定向到另一个页面。重定向操作支持将地址重定向到不同的主机上,这
- 本文实例为大家分享了Android实现画画板的具体代码,供大家参考,具体内容如下① 准备一个布局文件<?xml version=&qu
- 1,验证传入路径是否为正确的路径名(Windows系统,其他系统未使用)Java代码 // 验证字符串是否为正确路径名的正则表达式 
- 满满的都是干货 所有插件都是在 ctrl+alt+s 里的plugins 里进行搜索安装1、CodeGl