Spring Rest模板 - 来自webservice的204内容

时间:2017-08-15 05:49:09

标签: java spring web-services spring-web

我有一个休息服务,使用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;

1 个答案:

答案 0 :(得分:0)

HTTP 204是&#34; No Content&#34;的状态代码,但响应中似乎有垃圾内容。这可以在您的日志中看到:

ÿþ{"id":0}

这是你遇到问题的原因。

HTTP客户端不期望204响应的正文内容中有任何内容,因此不会读取它,因此响应处理程序不会看到有任何垃圾。然而,由于存在尚未消耗的垃圾,因此连接保持打开直到读取为止 - &gt;尝试重用连接的下一个连接会因读取超时而被命中。

有一个separate thread about a similar problem,问题解决了自定义HTTP请求执行程序。使用这样的执行器,你可以调用getBody()来获取垃圾响应体,然后下一个请求不会有任何问题。