2011-05-15 67 views
20

我使用RestTemplate.postForObject將信息發佈到Web服務。除了結果字符串之外,我還需要響應頭中的信息。有什麼辦法可以得到這個嗎?如何從RestTemplate讀取響應標題?

RestTemplate template = new RestTemplate(); 
String result = template.postForObject(url, request, String.class); 

回答

36

好吧,我終於明白了。交換方法正是我所需要的。它返回一個包含完整標題的HttpEntity。

RestTemplate template = new RestTemplate(); 
HttpEntity<String> response = template.exchange(url, HttpMethod.POST, request, String.class); 

String resultString = response.getBody(); 
HttpHeaders headers = response.getHeaders(); 
+2

如果您需要狀態:ResponseEntity response = template.exchange(...); response.getStatusCode(); – olafure 2013-11-20 13:05:57

+2

你也可以叫做'postForEntity',這是一個稍微簡單一些的方法。 – ayahuasca 2014-04-02 13:14:19

+0

我看到的唯一問題是,template.exchange方法使用restTemplate.getMessageConverters()爲您創建HttpMessageConverterExtractor。這可能是也可能不是你想要的。對於大多數情況,您將希望使用此方法並在spring-mvc-servlet.xml中設置消息轉換器。 – gaoagong 2014-09-17 17:50:04

1

我不知道這是推薦的方法,但它看起來像如果配置模板使用自定義HttpMessageConverter你可以從中提取響應標頭信息。

7

要做的最好的事情是使用execute方法,並通過ResponseExtractor,這將有權訪問標題。

private static class StringFromHeadersExtractor implements ResponseExtractor<String> { 

    public String extractData(ClientHttpResponse response) throws 
    { 
     return doSomthingWithHeader(response.getHeaders()); 
    } 
} 

另一種選擇(不乾淨的)是延長RestTemplate並重寫呼叫doExecute並添加任何特殊標頭處理邏輯存在。

+0

+1,但可能更好地擴展現有的'HttpMessageConverterExtractor'和超越,而不是寫一個全新的一個。 – skaffman 2011-05-15 08:31:23

+0

執行需要一個RequestCallback作爲其參數之一。我找不到如何實現它以包含請求主體的示例。 postForObject只需要一個HttpEntity,任何想法? – 2011-05-15 21:22:10

0
HttpEntity<?> entity = new HttpEntity<>(postObject, headers); // for request 
    HttpEntity<String> response = template.exchange(url, HttpMethod.POST, entity, String.class); 
    String result= response.getBody(); 
    HttpHeaders headers = response.getHeaders();