Feign报错 too many bytes written executing POST
此错误是出现在feign服务间调用时出现的问题
经过排查是configuration配置配文件出了问题
因为服务之间调用需要携带一些用户信息之类的 所以实现了Feign的RequestInterceptor
拦截器复制请求头,复制的时候是所有头都复制的,可能导致Content-length长度跟body不一致. 所以只需要判断如果是Content-length就跳过
修改前::::
@Configuration
public class FeignClientsConfiguration implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
// 此种方式是线程安全的
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
.getRequestAttributes();
// 不为空时取出请求中的header 原封不动的设置到feign请求中
if (null != attributes) {
HttpServletRequest request = attributes.getRequest();
// 遍历设置 也可从request取出整个Header 写到RequestTemplate 中
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
String values = request.getHeader(name);
requestTemplate.header(name, values);
}
}
}
}
}
修改后::::
@Configuration
public class FeignClientsConfiguration implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
// 此种方式是线程安全的
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
.getRequestAttributes();
// 不为空时取出请求中的header 原封不动的设置到feign请求中
if (null != attributes) {
HttpServletRequest request = attributes.getRequest();
// 遍历设置 也可从request取出整个Header 写到RequestTemplate 中
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
String values = request.getHeader(name);
// 跳过 content-length
if (name.equals("content-length")){
continue;
}
requestTemplate.header(name, values);
}
}
}
}
}
!!!重启测试,完美解决