使用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);
}
}
}
}