RestTemplate设置超时时间及返回状态码非200处理

  • Post category:http

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状态码进行了处理,可以根据实际需要进行修改和扩展。