微服务如何通过feign.RequestInterceptor传递参数
目录
- 微服务通过feign.RequestInterceptor传递参数
- 创建自定义请求拦截器
- 具体获取逻辑如下
- feign的拦截器RequestInterceptor
- 首先创建自定义的RequestInterceptor
- 然后定义一个feign的接口类
- 再创建一个controller
- 运行程序测试一下接口
- 查看程序打印
微服务通过feign.RequestInterceptor传递参数 Feign 支持请求拦截器,在发送请求前,可以对发送的模板进行操作,例如设置请求头等属性,自定请求拦截器需要实现 feign.RequestInterceptor 接口,该接口的方法 apply 有参数 template ,该参数类型为 RequestTemplate,我们可以根据实际情况对请求信息进行调整,示例如下:
创建自定义请求拦截器
在发送请求前增加了一个请求头信息,进行身份校验。
import feign.RequestInterceptor; import feign.RequestTemplate; public class MyRequestInterceptor implements RequestInterceptor{public void apply(RequestTemplatetemplate){ template.header("Authorization","123"); } }
服务端可以通过HttpServletRequest获取到前面传递的参数
具体获取逻辑如下
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes(); if (requestAttributes != null) {HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest(); request.getHeader("Authorization"); }
feign的拦截器RequestInterceptor SpringCloud的微服务使用Feign进行服务间调用的时候可以使用RequestInterceptor统一拦截请求来完成设置header等相关请求,但RequestInterceptor和ClientHttpRequestInterceptor有点不同,它拿不到原本的请求,所以要通过其他方法来获取原本的请求
首先创建自定义的RequestInterceptor
这里通过RequestContextHolder获取到当前的request
@Slf4j@Componentpublic class MyFeignInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate template) {ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes(); log.info("===request: {}", template.url()); template.header("aaaa", "bbbb"); }}
然后定义一个feign的接口类
@FeignClient(name = "SPRING-CLOUD-CLIENT-DEMO")public interface ClientFeign {@GetMapping("/demo/get")String weight(@RequestParam String param); }
再创建一个controller
@Slf4j@RestController@RequestMapping("/interceptor")public class InterceptorController {@Autowiredprivate ClientFeign clientFeign; @GetMapping("/feign")public String feign(@RequestParam String param) {return clientFeign.weight(param); }}
运行程序测试一下接口
文章图片
查看程序打印
可以看到进入了我们自定义的RequestInterceptor
INFO 25936 --- [ctor-http-nio-3] c.m.d.g.interceptor.MyFeignInterceptor: ===request: /demo/weight?param=a再查看feign调用的程序日志,可以看到设置的header信息
INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController: aaaa: a【微服务如何通过feign.RequestInterceptor传递参数】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController: websession: ECF4D97D02EEAFDDA3C15A7F1F050F61
INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController: header: aaaa, bbbb
INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController: header: accept, */*
INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController: header: user-agent, Java/1.8.0_191
INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController: header: host, 39.108.15.147:8801
INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController: header: connection, keep-alive
推荐阅读
- 别再问WiFi密码了,HMS|别再问WiFi密码了,HMS Core统一扫码服务让手机一键联网
- 金融数据查询增速三倍,服务器成本减半,海尔云链的 OLAP 引擎选型之路
- springboot|springboot 如何添加webapp文件夹
- 人物故事|人物故事 | 李飞飞离职谷歌背后(AI还很稚嫩 作为科学家很卑微)
- 开源云|开源云 IDE 产品新宠儿,如何使用 Gitpod 开发 APISIX()
- 3个案例,详解如何选择合适的研发模式|3个案例,详解如何选择合适的研发模式 | 研发效能提升36计
- Apache|Apache APISIX 集成 Consul KV,服务发现能力再升级
- API|API 网关 Apache APISIX 集成 Eureka 作为服务发现
- 应用身份服务IDaaS重磅升级
- 【北亚服务器数据恢复】ocfs2被误格式化成为Ext4的ocfs2文件系统数据恢复案例