引发问题的原因
- 系统要做国际化,SpringCloud需要将Accept-Language header param传递到feign服务。遍历RequestHeaders,将HeaderName以key-value形式添加到RequestTemplate中。
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
String value = request.getHeader(name);
requestTemplate.header(name, value);
}
}
发布到测试环境。Get请求测试没问题,信心满满,so easy。。。
问题发生
执行post请求时,系统开始报错。
(报错信息片段)
Caused by: java.io.IOException: Incomplete output stream
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1523)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
at feign.Client$Default.convertResponse(Client.java:143)
at feign.Client$Default.execute(Client.java:68)
下游feign服务,正常返回接口数据,上游报上述错误信息。
问题解决
在SpringCloud github issues中,有关于这个问题的解决办法,导致问题发生的原因就是header参数中传递了Content-Length导致的。需要在上游传递Header Param时,剔除这个HeaderName. github.com/spring-clou…
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
String value = request.getHeader(name);
if ("content-length".equalsIgnoreCase(name)) {
continue;
}
requestTemplate.header(name, value);
}
完美解决。