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

RestTemplate是Spring提供的一个用于访问Rest服务的HTTP客户端。在使用RestTemplate的过程中,我们可能会遇到请求超时或者接口返回非200状态码的情况,这时我们需要设置RestTemplate的超时时间和非200状态码的处理方式。

设置超时时间

RestTemplate设置超时时间的方式如下:

RestTemplate restTemplate = new RestTemplate();

SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setConnectTimeout(5000); // 设置连接超时时间为5秒
requestFactory.setReadTimeout(5000); // 设置读取超时时间为5秒

restTemplate.setRequestFactory(requestFactory);

上面的代码中,我们创建了一个SimpleClientHttpRequestFactory,并设置了连接超时时间和读取超时时间,然后将其设置到RestTemplate中。如果在5秒钟内无法建立连接或者读取数据,则会抛出异常。

另外,如果需要同时设置多个RestTemplate实例的超时时间,可以考虑使用RestTemplateBuilder:

RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder()
        .setConnectTimeout(Duration.ofSeconds(5))
        .setReadTimeout(Duration.ofSeconds(5));

RestTemplate restTemplate = restTemplateBuilder.build();

处理非200状态码

RestTemplate默认只能处理返回状态码为200的响应,如果需要处理其他状态码,则需要设置相应的ErrorHandler。

RestTemplate restTemplate = new RestTemplate();

restTemplate.setErrorHandler(new ResponseErrorHandler() {
    @Override
    public boolean hasError(ClientHttpResponse response) throws IOException {
        return !response.getStatusCode().is2xxSuccessful(); // 处理非200状态码
    }

    @Override
    public void handleError(ClientHttpResponse response) throws IOException {
        // 处理非200状态码的响应
    }
});

上面的代码中,我们创建了一个ResponseErrorHandler,并重写了hasError和handleError方法。在hasError方法中,我们判断响应的状态码是否为2xx类别,如果不是则说明返回了非200状态码,需要由handleError方法进行处理。

另外,我们也可以使用ResponseErrorHandlerAdapter来简化代码:

RestTemplate restTemplate = new RestTemplate();

restTemplate.setErrorHandler(new ResponseErrorHandlerAdapter() {
    @Override
    public void handleError(ClientHttpResponse response) throws IOException {
        // 处理非200状态码的响应
    }
});

上面的代码中,我们直接实现了handleError方法,省去了判断是否为非200状态码的过程。

示例:

RestTemplate restTemplate = new RestTemplate();

restTemplate.setErrorHandler(new ResponseErrorHandler() {
    @Override
    public boolean hasError(ClientHttpResponse response) throws IOException {
        return !response.getStatusCode().is2xxSuccessful();
    }

    @Override
    public void handleError(ClientHttpResponse response) throws IOException {
        String responseBody = StreamUtils.copyToString(response.getBody(), StandardCharsets.UTF_8);
        throw new RestClientException(String.format("请求URL:%s,返回状态码:%s,错误信息:%s",
                response.getStatusCode(),
                response.getStatusText(),
                responseBody));
    }
});

上面的代码中,我们重写了handleError方法,将响应中的错误信息解析出来,并抛出了一个RestClientException异常,以便调用者能够更好地处理非200状态码的情况。

另一个示例:

RestTemplate restTemplate = new RestTemplate();

restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
    @Override
    public void handleError(ClientHttpResponse response) throws IOException {
        String responseBody = StreamUtils.copyToString(response.getBody(), StandardCharsets.UTF_8);
        try {
            super.handleError(response);
        } catch (HttpStatusCodeException e) {
            throw new RestClientException(String.format("请求URL:%s,返回状态码:%s,错误信息:%s",
                    response.getStatusCode(),
                    response.getStatusText(),
                    responseBody));
        }
    }
});

上面的代码中,我们重写了DefaultResponseErrorHandler的handleError方法,先让其调用super.handleError方法处理响应,如果返回了HttpStatusCodeException异常,则将响应中的错误信息解析出来,并抛出一个RestClientException异常。这种方式比较灵活,可以在处理非200状态码的同时,复用DefaultResponseErrorHandler的一些处理逻辑。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:RestTemplate设置超时时间及返回状态码非200处理 - Python技术站

(0)
上一篇 2023年5月13日
下一篇 2023年5月13日

相关文章

  • Nginx整合Kafka的方法示例

    Nginx整合Kafka的方法示例 Nginx是一款高性能的Web服务器和反向代理服务器,而Kafka是一款高吞吐量的分布式消息队列。将Nginx与Kafka整合可以实现更高效消息传递处理。以下是Nginx整合Kafka的方法示例的完整攻略: 安装Kafka:首先我们需要安装Kafka。我们可以从Kafka官方网站下载Kafka二进制文件,并按照官方文档进行…

    http 2023年5月13日
    00
  • Nginx报错104:Connection reset by peer问题的解决及分析

    Nginx报错104:Connection reset by peer问题的解决及分析 在使用Nginx作为反向代理服务器时,有时会出现104: Connection by peer的错误。这个错误通常发生在客户与服务器之间的连接被重置时。这可能是由于网络问题、服务器负载过高或其他原因导致的。 解决方案 以下是一可能的解决方案: 1 增Nginx缓冲区大小 …

    http 2023年5月13日
    00
  • 解决axios:”timeout of 5000ms exceeded”超时的问题

    以下是关于“解决axios:”timeout of 5000ms exceeded”超时的问题”的完整攻略: 简介 在使用axios进行请求时,有时会出现“timeout of5000ms exceeded”超时的问题。文将介绍解决这个问题的方法,并提供两个示例说明。 解决步骤 以下解决axios超时问题的方法: 步骤一:增加超时时间 可以通过在axios请…

    http 2023年5月13日
    00
  • python安装包出现Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None))问题解决

    问题描述: 当我们使用pip安装Python包时,有时候会出现类似于以下提示信息: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by ‘ProxyError(‘Cannot connect to p…

    http 2023年5月13日
    00
  • JS 调试中常见的报错问题解决方法

    以下是关于“JS调试中常见的报错问题解决方法”的完整攻略: 简介 在JS开发过程中,我们经常会遇到各种各样的报错问题。这些报错问题可能会导致程序无法正常运行,因此我们需要及时解决这些问题。本文将介绍JS调试中常见的报错问题及其解决方法。 解决方法 1. 报错信息不清晰 有时候,我们在调试JS代码时会遇报错信息不清晰的问题。这个问题通是由于代码中存在语法错误或…

    http 2023年5月13日
    00
  • 一文教会你如何高效地搭建Docker私有仓库

    一文教会你如何高效地搭建Docker私有仓库 Docker私有仓库可以帮助企业、团队或个人更好地管理和共享自己制作的Docker镜像,加强了安全性,也方便了使用。本文将详细介绍如何高效地搭建Docker私有仓库的完整攻略。 前置条件 在开始之前,需要安装以下几个工具和软件: Docker CE Docker Compose 搭建步骤 1. 下载Docker官…

    http 2023年5月13日
    00
  • nginx安装以及配置的详细过程记录

    下面是nginx安装以及配置的详细过程记录: 安装nginx 1.安装前检查系统中是否已安装nginx nginx -v 如果已经安装,则会显示nginx版本号,如果没有安装则会提示“command not found”。 2.执行安装命令 sudo apt-get update #更新软件包 sudo apt-get install nginx #安装ng…

    http 2023年5月13日
    00
  • python3 googletrans超时报错问题及翻译工具优化方案 附源码

    下面是针对“python3googletrans超时报错问题及翻译工具优化方案”的完整攻略: 问题描述 在使用 Python3 版本的 Googletrans 翻译工具时,有时会出现“超时报错”的问题。这是因为调用翻译 API 次数过多,导致 API 访问速度降低,从而达到 API 超时限制而出现错误。 解决方案 为了解决这个问题,可以采取以下两种方法。 方…

    http 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部