RestTemplate是Spring框架提供的类库之一,用于发送HTTP请求和接收HTTP响应。在使用RestTemplate发送HTTP请求时,经常会遇到需要设置超时时间及处理非200状态码的情况。
设置超时时间:
RestTemplate提供了一个HttpComponentsClientHttpRequestFactory的实现类,可以使用它来设置超时时间。
示例代码:
CloseableHttpClient httpClient = HttpClients.custom().setConnectionTimeToLive(30, TimeUnit.SECONDS).build();
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setHttpClient(httpClient);
factory.setConnectionRequestTimeout(5000);
factory.setConnectTimeout(5000);
factory.setReadTimeout(5000);
RestTemplate restTemplate = new RestTemplate(factory);
ResponseEntity<String> response = restTemplate.getForEntity("https://example.com", String.class);
上面的代码中设置了连接超时时间、请求超时时间、读取超时时间分别为5000毫秒,最大连接时间为30秒。
处理返回状态码非200:
处理返回状态码非200的情况,可以使用RestTemplate的ResponseErrorHandler接口。
示例代码:
private class MyErrorHandler implements ResponseErrorHandler {
@Override
public void handleError(ClientHttpResponse response) throws IOException {
if (response.getStatusCode().series() == HttpStatus.Series.SERVER_ERROR) {
throw new RuntimeException("HTTP " + response.getStatusCode() + " error");
} else if (response.getStatusCode().series() == HttpStatus.Series.CLIENT_ERROR) {
throw new HttpClientErrorException(response.getStatusCode());
}
}
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
return response.getStatusCode().series() == HttpStatus.Series.CLIENT_ERROR
|| response.getStatusCode().series() == HttpStatus.Series.SERVER_ERROR;
}
}
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new MyErrorHandler());
ResponseEntity<String> response = restTemplate.getForEntity("https://example.com", String.class);
上面的代码中,处理了状态码为4xx和5xx的情况,如果发生这些错误,将抛出相应的异常。
上述两个示例分别对RestTemplate的超时设置和非200状态码进行了处理,可以根据实际需要进行修改和扩展。