java - Spring Rest 模板 - 来自 Web 服务的 204 内容响应

标签 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();
}

当 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/

相关文章:

java - 上下文初始化时遇到异常

java - 有没有办法使用 while 循环来计算迭代次数?

java - 链表实现的先有鸡还是先有蛋的困境

java - 与接口(interface)上的注释匹配的 Spring AOP 切入点

java - 基于现有 WSDL 生成 Java Webservice 的工具

JavaFX 表格 View : can I keep column data as a float so it's sortable and format/show it as a string somehow?

java - Spring 返回 String 作为 JSON,行为改变

java - Spring Security 3.1 + JPA - 空指针异常

java - 从 WSDL 创建 Web 服务时出现问题

java - 如何在axis生成的客户端中实现线程以使用java向web服务发出多个请求