使用feign时提供者从request中获取不到参数值解决方法

使用feign时提供者从request中获取不到参数值解决方法

问题:

在开发中,A项目需要在后端调用B项目的feign接口。B项目原来的参数接收都是在httpServletRequest里面,如下图:
在这里插入图片描述
我们知道feign接口是不支持HttpServletRequest作为参数的,所以feign接口如下
在这里插入图片描述

分析:

由于在consumer中子链路调用feign接口,request不支持继承。在调用feign接口时原有的request已经不会跟随到新的请求中,所以provider中request是空的,获取不到参数值
在这里插入图片描述

解决办法

request中的值手动设置到feign请求的http调用上。

@Configuration
public class OpenFeignConfig implements RequestInterceptor {
    
    

    private static final org.slf4j.Logger _logger = LoggerFactory.getLogger(OpenFeignConfig.class);

    /**
     * NONE(默认):不记录任何日志,性能最佳,适用于生产环境;
     * BASIC:仅记录请求方法、URL、响应状态代码以及执行时间,适用于生产环境追踪问题;
     * HEADERS:在BASIC级别的基础上,记录请求和响应的header;
     * FULL:记录请求和响应的header、body和元数据,适用于开发测试定位问题。
     *
     * @return {@link Logger.Level }
     * @Author wangxiaole
     * @Date 2023/09/07
     **/
    @Bean
    Logger.Level feginLoggerLevel() {
    
    
        return Logger.Level.FULL;
    }

    @Override
    public void apply(RequestTemplate requestTemplate) {
    
    
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        Enumeration<String> headerNames = request.getHeaderNames();
        // 传递所有请求头,防止部分丢失
        if (headerNames != null) {
    
    
            while (headerNames.hasMoreElements()) {
    
    
                String name = headerNames.nextElement();
                String values = request.getHeader(name);
                requestTemplate.header(name, values);
            }
        }

    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43811057/article/details/132764715
今日推荐