RestTemplate异常时无法获取body内容

/ Spring Boot / 1 条评论 / 68浏览

在使用RestTemplate调用其他服务时,发现服务返回401状态码时,会抛出HttpClientErrorException异常。但是通过getResponseBodyAsString()却无法获取Response Body内容,下面是实际例子。

实际情况

配置

@Bean
RestTemplate restTemplate() {
    return new RestTemplate();
}

使用

@RunWith(SpringRunner.class)
@SpringBootTest
public class AppTest {

    @Autowired
    private RestTemplate restTemplate;

    @Test
    public void postForEntity() {
        ResponseEntity<String> entity = null;
        try {
            entity = restTemplate.postForEntity("这里是url", null, String.class);
        } catch (HttpClientErrorException e) {
            System.out.println("body: " + e.getResponseBodyAsString());
        }
        System.out.println(entity);
    }
}

结果

结果

解决

网上解决方案

restTemplate 调用异常处理

他的总结:主要就是这个restTemplate没有对错误请求做处理,只有正确请求.所以需要手动增加setErrorHandler方法处理.

其实,restTemplate默认采用DefaultResponseErrorHandler进行错误处理的,也读取了body,但是没有读取到(后面解释原因)。

按照这位道友的教程,还是无法解决。

正确姿势

当然是看官网描述:

官网描述

即: Note that the java.net implementation for HTTP requests may raise an exception when accessing the status of a response that represents an error (e.g. 401). If this is an issue, switch to HttpComponentsClientHttpRequestFactory instead.

因为restTemplate默认采用java.net实现,401状态码会出现异常,无法获取到body信息,我们换成http client实现即可。

添加依赖

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.5</version>
 </dependency>

配置RestTemplate

@Bean
RestTemplate restTemplate() {
    return new RestTemplate(new HttpComponentsClientHttpRequestFactory());
}

运行

运行

  1. bobo很6

    回复