如何从RestTemplate读取响应头?

47

我正在使用RestTemplate.postForObject方法将信息发布到Web服务。除了结果字符串外,我需要响应头中的信息。有没有办法获取这个信息?

RestTemplate template = new RestTemplate();
String result = template.postForObject(url, request, String.class);
4个回答

73

好的,我终于想通了。exchange方法正是我所需要的。它返回一个包含所有头信息的HttpEntity。

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

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

3
如果您需要获取状态信息:ResponseEntity<?> response = template.exchange(...); response.getStatusCode(); - olafure
5
你也可以调用“postForEntity”,它是一个稍微简单一些的方法。 - ayahuasca
我唯一看到的问题是template.exchange方法使用restTemplate.getMessageConverters()来为您创建HttpMessageConverterExtractor。这可能是您想要的,也可能不是。对于大多数情况,您将希望使用它并在spring-mvc-servlet.xml中设置您的消息转换器。 - gaoagong

9

最好的做法是使用execute方法,并传入一个ResponseExtractor,它将可以访问到头信息。

private static class StringFromHeadersExtractor implements ResponseExtractor<String> {

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

另一个选项(不太干净的)是扩展 RestTemplate 并覆盖对 doExecute 的调用,在那里添加任何特殊的头处理逻辑。


+1,但最好是扩展现有的HttpMessageConverterExtractor并进行覆盖,而不是编写全新的。 - skaffman
执行需要一个RequestCallback作为其参数之一。我无法找到任何实现它包含请求正文的示例。postForObject只需要一个HttpEntity,有什么想法吗? - Eric Milas

3
  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();

1

我不确定这是否是推荐的方法,但如果您配置模板使用自定义的HttpMessageConverter,似乎可以从响应头中提取信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接