我有一个休息服务,使用Spring的RestTemplate与Apache HttpClient一起消费,
@Autowired
public ClientImpl(@Value("${base-uri}") final String baseUrl,
@Qualifier("restOperations") RestOperations restTemplate) {
serviceUrl = baseUrl;
restTemplate = restTemplate;
}
private List<ResponseDetails> processRequest(CustomRequest request) throws Exception {
ResponseEntity<ResponseDetails[]> responseEntity = restTemplate.exchange(serviceUrl, HttpMethod.POST, entity, ResponseDetails[].class);
if (responseEntity.getStatusCode().value() == 204) {
return Collections.<ResponseDetails>emptyList();
}
ResponseDetails[] response = responseEntity.getBody();
return response != null ? Lists.newArrayList(response) : Collections.<ResponseDetails>emptyList();
}
当webservice返回204响应时,204响应后的第二个服务调用将因读取超时而失败。
Spring-web:4.3.5
我无法弄清楚原因。有什么帮助吗?
编辑: 从调试日志
org.apache.http.impl.conn.DefaultHttpResponseParser; Garbage in 响应:ÿþ{“id”:0} HTTP / 1.1 204找不到
httpclient对服务器日志的响应:
&lt; 204 No Content,{Cache-Control = [no-cache],Pragma = [no-cache], 内容类型= [应用/ JSON; charset = utf-16],Expires = [ - 1], Server = [some],X-AspNet-Version = [someversion],X-Powered-By = [ASP.NET], 日期= [somedate]}&GT;
答案 0 :(得分:0)
HTTP 204是&#34; No Content&#34;的状态代码,但响应中似乎有垃圾内容。这可以在您的日志中看到:
ÿþ{"id":0}
这是你遇到问题的原因。
HTTP客户端不期望204响应的正文内容中有任何内容,因此不会读取它,因此响应处理程序不会看到有任何垃圾。然而,由于存在尚未消耗的垃圾,因此连接保持打开直到读取为止 - &gt;尝试重用连接的下一个连接会因读取超时而被命中。
有一个separate thread about a similar problem,问题解决了自定义HTTP请求执行程序。使用这样的执行器,你可以调用getBody()来获取垃圾响应体,然后下一个请求不会有任何问题。