我有一个休息服务,并使用 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();
}
当 Web 服务返回 204 响应时,204 响应后的第二个服务调用将失败并出现读取超时。
Spring-web:4.3.5
我无法找出原因。有什么帮助吗?
编辑: 从调试日志来看,
org.apache.http.impl.conn.DefaultHttpResponseParser;Garbage in response: ÿþ{"id":0}HTTP/1.1 204 Could not find
httpclient 在服务器日志中的响应:
<204 No Content,{Cache-Control=[no-cache], Pragma=[no-cache], Content-Type=[application/json; charset=utf-16], Expires=[-1], Server=[some], X-AspNet-Version=[someversion], X-Powered-By=[ASP.NET], Date=[somedate]}>
最佳答案
HTTP 204 是“无内容”的状态代码,但响应中似乎存在垃圾内容。这可以在您的日志中看到:
ÿþ{"id":0}
这就是您遇到问题的原因。
HTTP 客户端不期望 204 响应的正文内容中有任何内容,因此不会读取它,因此响应处理程序不会看到有任何垃圾。然而,由于存在尚未消耗的垃圾,因此连接保持打开状态,直到读取 -> 尝试重用该连接的下一个连接会遇到读取超时。
有一个separate thread about a similar problem ,其中问题是通过自定义 HTTP 请求执行器解决的。使用这样的执行器,您可以调用 getBody() 来获取垃圾响应正文,然后下次请求就不会出现任何问题。
关于java - Spring Rest 模板 - 来自 Web 服务的 204 内容响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45687123/