RestTemplate是Spring提供的一个用于访问Rest服务的HTTP客户端。在使用RestTemplate的过程中,我们可能会遇到请求超时或者接口返回非200状态码的情况,这时我们需要设置RestTemplate的超时时间和非200状态码的处理方式。
设置超时时间
RestTemplate设置超时时间的方式如下:
RestTemplate restTemplate = new RestTemplate();
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setConnectTimeout(5000); // 设置连接超时时间为5秒
requestFactory.setReadTimeout(5000); // 设置读取超时时间为5秒
restTemplate.setRequestFactory(requestFactory);
上面的代码中,我们创建了一个SimpleClientHttpRequestFactory,并设置了连接超时时间和读取超时时间,然后将其设置到RestTemplate中。如果在5秒钟内无法建立连接或者读取数据,则会抛出异常。
另外,如果需要同时设置多个RestTemplate实例的超时时间,可以考虑使用RestTemplateBuilder:
RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder()
.setConnectTimeout(Duration.ofSeconds(5))
.setReadTimeout(Duration.ofSeconds(5));
RestTemplate restTemplate = restTemplateBuilder.build();
处理非200状态码
RestTemplate默认只能处理返回状态码为200的响应,如果需要处理其他状态码,则需要设置相应的ErrorHandler。
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new ResponseErrorHandler() {
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
return !response.getStatusCode().is2xxSuccessful(); // 处理非200状态码
}
@Override
public void handleError(ClientHttpResponse response) throws IOException {
// 处理非200状态码的响应
}
});
上面的代码中,我们创建了一个ResponseErrorHandler,并重写了hasError和handleError方法。在hasError方法中,我们判断响应的状态码是否为2xx类别,如果不是则说明返回了非200状态码,需要由handleError方法进行处理。
另外,我们也可以使用ResponseErrorHandlerAdapter来简化代码:
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new ResponseErrorHandlerAdapter() {
@Override
public void handleError(ClientHttpResponse response) throws IOException {
// 处理非200状态码的响应
}
});
上面的代码中,我们直接实现了handleError方法,省去了判断是否为非200状态码的过程。
示例:
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new ResponseErrorHandler() {
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
return !response.getStatusCode().is2xxSuccessful();
}
@Override
public void handleError(ClientHttpResponse response) throws IOException {
String responseBody = StreamUtils.copyToString(response.getBody(), StandardCharsets.UTF_8);
throw new RestClientException(String.format("请求URL:%s,返回状态码:%s,错误信息:%s",
response.getStatusCode(),
response.getStatusText(),
responseBody));
}
});
上面的代码中,我们重写了handleError方法,将响应中的错误信息解析出来,并抛出了一个RestClientException异常,以便调用者能够更好地处理非200状态码的情况。
另一个示例:
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
@Override
public void handleError(ClientHttpResponse response) throws IOException {
String responseBody = StreamUtils.copyToString(response.getBody(), StandardCharsets.UTF_8);
try {
super.handleError(response);
} catch (HttpStatusCodeException e) {
throw new RestClientException(String.format("请求URL:%s,返回状态码:%s,错误信息:%s",
response.getStatusCode(),
response.getStatusText(),
responseBody));
}
}
});
上面的代码中,我们重写了DefaultResponseErrorHandler的handleError方法,先让其调用super.handleError方法处理响应,如果返回了HttpStatusCodeException异常,则将响应中的错误信息解析出来,并抛出一个RestClientException异常。这种方式比较灵活,可以在处理非200状态码的同时,复用DefaultResponseErrorHandler的一些处理逻辑。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:RestTemplate设置超时时间及返回状态码非200处理 - Python技术站