feign传递文件,feign远程调用的各种参数传递过程
目录
解决服务之间调用传递tokenFeign有提供一个接口请求拦截器调用方式假装调用服务各种坑处理编写被调用服务编写调用美国石油学会(美国石油协会)编写客户端服务
解决服务之间调用传递token
现在的微服务基本就是SpringSecurity Oauth2做的授权和认证,假如多个服务直接要通过费金来调用,会报错401
答:有做权限处理的服务接口直接调用会造成调用时出现http 401未授权的错误,继而导致最终服务的http 500内部服务器错误乙、解决方式:最方便的就是往请求头里加上令牌,一起带过去;
Feign有提供一个接口RequestInterceptor
只要实现这个接口,简单做一些处理,比如说我们验证请求头的代币叫访问令牌,我们就先取出当前请求的令牌,然后放到假装请求头上;
公共类FeignConfig实现请求拦截器{ @ Override public void apply(request template request template){ ServletRequestAttributes attributes=(ServletRequestAttributes)requestcontextholder。getrequestattributes();http servlet请求请求=属性。get request();//添加令牌请求模板。标题(http标题.AUTHORIZATION,request.getHeader(HttpHeaders .授权));} }
调用方式
@ feign client(name= qtjuaa ,configuration=feign config。类)公共接口uaa客户端{ @请求映射(value=/API/test ,method=RequestMethod .获取)字符串测试();}
Feign调用服务各种坑处理
编写被调用服务
@ refresh scope @ RestControllerpublic class XXXController扩展基本控制器实现IndicatorsFeignApi { @ resource private XXXService XXX;@ override public WrapperCommonVo get xxxx(@ request body common dto common dto){ try { common VO VO=XXX。获取数据(普通dto);返回包装映射器。ok(VO);} catch(Exception e){ e . printstacktrace();返回WrapMapper.error(系统异常,请联系管理员!);} } }//服务不进行展示,注意参数传递至服务层时要加入注解@请求体等才能获取参数在配置文件添加假装相关配置
编写调用api
砰的一声文件中添加相关依赖
spring框架。云泉-云启动器-hystrixorg。spring框架。云泉-云启动器-网飞-hystrix-仪表板调用美国石油学会(美国石油协会)
@FeignClient(value=被调用服务名)公共接口指示符feignapi { @ post mapping(value=/API/get xxxx ,consumes=application/json ,headers={ Accept=application/JSON , Content-Type=application/JSON })WrapperCommonVo get xxxx(@ request body common dto common dto);}假装调用错误处理,发生相关错误是会跳转至撤退处理
@Componentpublic类指示器实现指示器feignapi { @ override public wrapper commonvo get xxxx(common dto common dto){ system。出去。println(====调用服务获数据发生异常======);返回null}}当启用撤退后,有些报错不会打印在控制台上,这时可以修改配置中的
假装: hystrix : enabled : true将使能够改为假的,错误发生后将不会跳转退路.
此处有一个坑,当时调用的时候服务是可以调用成功的,但是有一个报错:
无法提取响应:未找到适合响应类型[XXXX]和内容类型【文本/html;的http messageconvertercharset=UTF 8]
貌似是返回数据的编码与接收实体类不一样,导致报错。加上headers={ Accept=application/JSON , Content-Type=application/JSON }解决了相关问题。
编写客户端服务
//serviceImp层@ Autowired private indicators feignapi;//声明调用API @ Override public common VO get XXX(common dto common dto){ WrapperCommonVo result=API。get xxxx(常用dto);//服务调用如果(结果!=null){返回结果。获取结果();} else {返回新的公共VO();} }以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行它.
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。