关于openfeign的一个有趣的问题

2025-12-12 0 765

一、问题背景

需要调用第三方和风天气api,获取天气信息
编写了如下使用openfeign调用的接口
image.png

二、问题描述

1、直接通过apifox调用第三方api,没问题
image.png

2、代码中直接通过okhttp调用第三方api,没问题
image.png

3、使用上述的feign调用第三方api,产生2个问题,问题1:401(==偶现==)、问题2:乱码(==必现==),而通过断点排查,调用api的header和参数都是正确的
feign.FeignException$Unauthorized: [401] during [GET] to [] [IWeatherApiService#getWeatherNow(String,String)]: [��U̱� �_!�ZA\'6W ���r�84�鿋n�ox3 31��8��n��@��B�5&�S?^�$\"kOw��X��G�;֞�UͮJ$NoТ$�w��s@qih�o�Y�w�(�[S��}��֫��j��cV��HE4,���N��] at feign.FeignException.clientErrorStatus(FeignException.java:197)

三、问题原因

3.1、问题1:乱码

1、这个第三方api的响应开启了gzip压缩,响应体是 gzip 压缩的
image.png

2、Feign 默认使用 JDK 自带的 HttpURLConnection 作为 HTTP Client,不支持处理gizp
企业微信截图_17636033284560.png

3.2、问题2:401

1、和风天气支持header中放入Authorization的认证方式
2、我们服务依赖的feign的基础服务中,实现了RequestInterceptor,重写了其apply方法,将我们的一些信息放入了header,其中,有些场景会有Authorization放入,而这个拦截器是在我们放入之后,因此会将我们的认证信息覆盖掉
因此就出现了401

四、问题解决

4.1、乱码问题解决

关于openfeign的一个有趣的问题
==将HTTP Client换为okhttp==

feign:
  okhttp:
    enabled: true
    max-connections: 200
    max-connections-per-route: 50

4.2、401问题解决

4.2.1、方式1:覆盖feign的基础服务中的拦截器

  • 编写拦截器,认证信息放入header
public class WeatherFeignRequestInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate requestTemplate) {
        requestTemplate.header(\"Authorization\", \"1111\");
    }
}
  • 编写配置文件
@Configuration
public class WeatherFeignConfig {
    // 注意这里方法名需要跟依赖的项目的拦截器的配置文件中的一样,这样是起到覆盖作用的重要环节
    @Bean
    public RequestInterceptor requestInterceptor() {
        return new WeatherFeignRequestInterceptor();
    }
}
  • feignClient指定config
    image.png

这样的话,就会覆盖feign的基础服务中的拦截器,仅使用我们写的这个拦截器,就不会出现Authorization被覆盖的问题了,也就不会出现401了

4.2.2、方式2:调整拦截器执行顺序,把我们的拦截器放在最后面

  • 修改feign的基础服务中的拦截器
public class BaseFeignRequestInterceptor implements RequestInterceptor, Ordered {
    public void apply(RequestTemplate requestTemplate) {

    }

    public int getOrder() {
        return 2147483547;
    }
}
  • 当前服务的拦截器增加排序
@Slf4j
public class WeatherApiFeignRequestInterceptor implements RequestInterceptor, Ordered {

    private static final String WEATHER_API_SERVICE = \"weatherApiService\";

    @Override
    public void apply(RequestTemplate template) {
        // 非天气服务接口,不处理
        if (!WEATHER_API_SERVICE.equalsIgnoreCase(template.feignTarget().name())) {
            return;
        }
        // 清空所有现有的请求头
        template.headers(null);
        // 只添加你需要的请求头
        template.header(\"Authorization\", 11111);
        template.header(\"Content-Type\", \"application/json\");
    }

    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE - 99;
    }
}
  • 编写配置文件
@Configuration
public class WeatherFeignConfig {
    // 这里方法名随便写
    @Bean
    public RequestInterceptor weatherRequestInterceptor() {
        return new WeatherFeignRequestInterceptor();
    }
}

如此,这个两个拦截器都会生效,不过我们自定义的拦截器会更晚执行,就不会出现我们的认证信息被覆盖的问题了

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 关于openfeign的一个有趣的问题 https://www.zuozi.net/36047.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务