SpringCloud实战:Feign调用技巧SpringCloud实战:ConfigServer基本使用技巧SpringCloud实战:Feign调用如何传递请求头参数SpringCloud实战:诡异的OPTIONS请求问题SpringCloud实战:高并发下SpringCache分布式缓存坑SpringCloud实战:值得收藏的微服务七篇SpringCloud实战:Feign你不知道的一些坑SpringCloud实战:基于RESTful架构风格的API设计原则SpringCloud实战:Restful架构API接口经典设计误区SpringCloud实战:ConfigServer微服务端使妙用
前言
最近微服务项目上,用到了HTTP协议自定义请求头Headers信息,用于在Feign客户端接口调用,如何传递自定义请求头Headers信息。
完整用法
定义请求头
前端ajax定义其全局请求头信息:pid,ut,wid
headers: {“pid”: getLocalInfo(“pid”),”ut”: getToken(“ut”),”wid”: “WS110022”}
定义Feign客户端类
定义API接口提供方:XXX-service
定义请求拦截器:feign.RequestInterceptor
当进行Feign调用时,RequestInterceptor会拦截Feign请求。通过RequestContextHolder.getRequestAttributes()获取Request对象,然后把request.getHeaderNames()获取请求头信息(pid,ut,wid),通过RequestTemplate把请求头信息传到API接口提供方
Feign:Request拦截器原理
源码解读:大意是传递请求头信息。
Zero or more {@code RequestInterceptors} may be configured for purposes such as adding headers toall requests.No guarantees are give with regards to the order that interceptors are applied.Once interceptors are applied, {@link Target#apply(RequestTemplate)} is called to create the immutable http request sent via {@link Client#execute(Request, feign.Request.Options)}.
在feign-core和心包,有个Feign的build方法,构建拦截器核心Handler:SynchronousMethodHandler,实例化RequestInterceptor子类
RequestInterceptor注册
真正实例化RequestInterceptor拦截器的是反射对象ReflectiveFeign的newInstance方法,其原理是使用了JDK动态代理设计模式
T proxy = (T) Proxy.newProxyInstance(target.type().getClassLoader(), new Class<?>[]{target.type()}, handler);
调用SynchronousMethodHandler的invoke方法实现请求头参数传递。
SynchronousMethodHandler的executeAndDecode方法处理Response数据。
关于我
大家好,10年JAVA老兵,擅长微服务,分布式,并发,工作流。请大家多多关注我。
有需要Java资料的同学,可以关注之后私信哈,回复“资料”可以免费领取Java BAT面试宝典/微服务/SpringCloud/SpringBoot等视频和资料,亲记得要点赞转发哦!!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)