feign获取响应头信息,feign调用文件上传接口
目录
假装传递请求头信息实现请求拦截器接口注册配置假装调用微服务传递页眉请求头
Feign传递请求头信息
在我之前的文章服务网关春云网关中,将用户的登录编号放在了请求头中传递给内部服务。
但是当内部服务之间存在假装调用时,那么请求头信息会在假装请求的时候传递吗?不会,请求的头信息和请求参数都不会进行传递。
但是我们可以通过通过实现请求拦截器接口,完成对所有的假装请求,传递请求头和请求参数。
实现RequestInterceptor接口
导入假货请求拦截器导入佯。请求模板;导入组织。spring框架。网络。语境。请求。requestcontextholder导入组织。spring框架。网络。语境。请求。servletrequestattributes导入javax。servlet。http。http servlet请求;导入Java。util。枚举;/***假装请求拦截器(设置请求头,传递登录信息)* * @作者西蒙* @ create 2018-09-07 9:51 * */公共类feignbasicautrequestinterceptor实现请求拦截器{ @ Override public void apply(request template request template){ ServletRequestAttributes attributes=(ServletRequestAttributes)RequestContextHolder .getRequestAttributes();http servlet请求请求=属性。get request();枚举字符串头名称=请求。获取标头名称();if (headerNames!=null){ while(标头名称。hasmorelements()){ String name=头名称。next element();字符串值=请求。获取标题(名称);requestTemplate.header名称,值);} } }}这里只设置了请求头,如果想传递请求参数,可以参考如下代码:
公共类feignbasicautrequestinterceptor实现请求拦截器{ @ Override public void apply(request template request template){ ServletRequestAttributes attributes=(ServletRequestAttributes)RequestContextHolder .getRequestAttributes();http servlet请求请求=属性。get request();枚举字符串头名称=请求。获取标头名称();if (headerNames!=null){ while(标头名称。hasmorelements()){ String name=头名称。next element();字符串值=请求。获取标题(名称);requestTemplate.header名称,值);} }枚举字符串主体名称=请求。getparameternames();string buffer body=new string buffer();if (bodyNames!=null){ while(正文名称。hasmorelements()){ String name=body names。next element();字符串值=请求。getparameter(名称);body.append(名称)。追加(=)。追加(值)。追加("");} } if(body.length()!=0){ body。删除charat(body。长度()-1);模板。身体(身体。tostring());伐木工。info( feign interceptor body : { } ,body。tostring());} }}
注册配置
包com。南吉斯。ibase。个人配置。配置;导入com。南吉斯。ibase。utils。feignbasicauthrequestinterceptor;导入com。南吉斯。ibase。utils。feignspringformencoder导入佯请求拦截器导入假装。编解码器。编码器;导入org。spring框架。语境。注释。豆;导入org。spring框架。语境。注释。配置;/***假装配置注册(全局)* * @作者Simon * @ create 2018-08-20 11:44 * */@配置公类FeignSupportConfig { /** * feign请求拦截器* * @ return */@ Bean公共请求拦截器请求拦截器(){ return new feignbasicauthrequesticeptor();}}这个文件放在项目的扫描目录下,所有的假装调用都会使用此配置。如果只有某个假装调用则可以这样设置(但配置类不能在扫描目录下):
@FeignClient(name=organ ,path=/organ/OrganInfo ,configuration=feignsupportconfig。类)
Feign调用微服务传递header请求头
包com。奇蒂奇。模块。核心。配置;导入佯请求拦截器导入org。spring框架。语境。注释。豆;导入org。spring框架。语境。注释。配置;导入组织。spring框架。网络。语境。请求。requestcontextholder导入组织。spring框架。网络。语境。请求。servletrequestattributes导入javax。servlet。http。http servlet请求;导入Java。util。枚举;@配置公共类FeignConfig { @ Bean公共请求拦截器头拦截器(){ return template-{ ServletRequestAttributes attributes=(ServletRequestAttributes)requestcontextholder。getrequestattributes();if (null!=属性){ http servlet请求request=属性。get request();枚举字符串头名称=请求。获取标头名称();if (headerNames!=null){ while(标头名称。hasmorelements()){ String name=头名称。next element();字符串值=请求。获取标题(名称);模板.标题(名称,值);} } } };}}需注意,假装调用时不能调用含有响应参数(比如常用的数据导出),以下就不能远程调用,目前没找到解决办法
以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行它。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。