2011-05-15 81 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();