1

我正在尝试RestTemplateRetrofit2。如果 api 返回 4XX/5XX,这两个库都会抛出异常。来自邮递员的 api 会提供 JSON 响应正文以及 4XX/5XX。如何使用 RestTemplate 或 Retrofit2 检索此 JSON 响应。

谢谢。

4

2 回答 2

0

为此,您必须在为 RestTemplate 创建 bean 时创建 RestTemplateError 处理程序并注册该类。

@Bean
public RestTemplate getBasicRestTemplate() {
     RestTemplate restTemplate = new RestTemplate();
     restTemplate.setErrorHandler(new RestTemplateResponseErrorHandler());
     return restTemplate;
}

您的处理程序类必须实现ResponseErrorHandler。您可以读取存储在body中的 json 响应。

@Component
public class RestTemplateResponseErrorHandler implements ResponseErrorHandler {
    
    private static final Logger LOGGER = LoggerFactory.getLogger(RestTemplateResponseErrorHandler.class);

    @Override
    public boolean hasError(ClientHttpResponse httpResponse) throws IOException {
        return httpResponse.getStatusCode().series() == CLIENT_ERROR
                || httpResponse.getStatusCode().series() == SERVER_ERROR;
    }

    @Override
    public void handleError(ClientHttpResponse httpResponse) throws IOException {
        if (httpResponse.getStatusCode().series() == SERVER_ERROR) {
            LOGGER.error("Handling server error response statusCode:{} ", httpResponse.getStatusCode());
        } else if (httpResponse.getStatusCode().series() == CLIENT_ERROR) {
            LOGGER.error("Handling Client error response statusCode:{} ", httpResponse.getStatusCode());
            String body;
            InputStreamReader inputStreamReader = new InputStreamReader(httpResponse.getBody(),
                    StandardCharsets.UTF_8);
            body = new BufferedReader(inputStreamReader).lines().collect(Collectors.joining("\n"));
            throw new CustomException(httpResponse.getStatusCode().toString(), httpResponse, body);
        }
    }
}
于 2021-06-18T07:13:23.680 回答
0

使用HttpClientErrorException, HttpStatusCodeException after try 块,如下所示。

    try{
        restTemplate.exchange("url", HttpMethod.GET, null, String.class);
    }
    catch (HttpClientErrorException errorException){
        logger.info("Status code :: {}, Exception message :: {} , response body ::{}" , e.getStatusCode()
                e.getMessage(), e.getResponseBodyAsString());
    }
    catch (HttpStatusCodeException e){
        logger.info("Status code :: {}, Exception message :: {} , response body ::{}" , e.getStatusCode()
                e.getMessage(), e.getResponseBodyAsString());

    }
于 2021-06-20T06:47:24.203 回答