【问题标题】:How to get json response in Java in case of 4XX and 5XX error在出现 4XX 和 5XX 错误的情况下如何在 Java 中获取 json 响应
【发布时间】:2021-09-02 22:26:35
【问题描述】:

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

谢谢。

【问题讨论】:

  • 如已回答,您可以使用 globalExceptionHandler 根据您的要求转换响应

标签: java retrofit2 resttemplate spring-resttemplate


【解决方案1】:

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

@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);
        }
    }
}

【讨论】:

    【解决方案2】:

    在try块之后使用HttpClientErrorExceptionHttpStatusCodeException,如下所示。

        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());
    
        }
    

    【讨论】:

    • 我试过了,e.getResponseBodyAsString() 返回“HTTP 401”
    • 你从邮递员那里得到了什么。 401 是未经授权的,因此在您的代码中您返回未经授权的访问。
    • 我修改了代码。你能像上面那样试试吗?
    猜你喜欢
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 2012-06-26
    • 2023-01-23
    • 2011-07-17
    • 1970-01-01
    相关资源
    最近更新 更多