簡體   English   中英

Spring Rest模板-204內容來自Web服務

[英]Spring Rest template - 204 content in response from webservice

我有一個休息服務,並且使用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響應之后的第二個服務調用會因讀取超時而失敗。

春季網:4.3.5

我不知道原因。 有什么幫助嗎?

編輯:從調試日志,

org.apache.http.impl.conn.DefaultHttpResponseParser;響應中的垃圾:ÿþ{“ id”:0} HTTP / 1.1 204找不到

httpclient在服務器日志中的響應:

<204沒有內容,{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響應的正文內容中有任何內容,因此不會讀取它,因此響應處理程序不會看到有任何垃圾。 但是,由於存在尚未消耗的垃圾,因此連接將保持打開狀態直到被讀取->試圖重用該連接的下一個連接會因讀取超時而命中。

關於類似問題 ,有一個單獨的線程 ,該問題可通過自定義HTTP請求執行程序解決。 使用這樣的執行程序,您可以調用getBody()來獲取垃圾響應正文,然后下一個請求不會有任何問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM