我正在尝试RestTemplate和Retrofit2。如果 api 返回 4XX/5XX,这两个库都会抛出异常。来自邮递员的 api 会提供 JSON 响应正文以及 4XX/5XX。如何使用 RestTemplate 或 Retrofit2 检索此 JSON 响应。
谢谢。
我正在尝试RestTemplate和Retrofit2。如果 api 返回 4XX/5XX,这两个库都会抛出异常。来自邮递员的 api 会提供 JSON 响应正文以及 4XX/5XX。如何使用 RestTemplate 或 Retrofit2 检索此 JSON 响应。
谢谢。
为此,您必须在为 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);
}
}
}
使用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());
}