服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - RestTemplate设置超时时间及返回状态码非200处理

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

2023-02-20 15:11艾米莉Emily Java教程

这篇文章主要为大家介绍了RestTemplate设置超时时间及返回状态码非200处理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

默认情况下使用RestTemplate如果返回结果的状态码是200的话就正常处理,否则都会抛出异常;

1.调试postForEntity请求

调试postForEntity请求的方法找到判断响应结果状态码的方法是org.springframework.web.client.DefaultResponseErrorHandler类中的hasError方法

?
1
2
3
4
5
6
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
    int rawStatusCode = response.getRawStatusCode();
    HttpStatus statusCode = HttpStatus.resolve(rawStatusCode);
    return (statusCode != null ? hasError(statusCode) : hasError(rawStatusCode));
}

代码再往上跟踪一级,如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
protected void handleResponse(URI url, HttpMethod method, ClientHttpResponse response) throws IOException {
    ResponseErrorHandler errorHandler = getErrorHandler();
    boolean hasError = errorHandler.hasError(response);
    if (logger.isDebugEnabled()) {
        try {
            int code = response.getRawStatusCode();
            HttpStatus status = HttpStatus.resolve(code);
            logger.debug("Response " + (status != null ? status : code));
        }
        catch (IOException ex) {
            // ignore
        }
    }
    if (hasError) {
        errorHandler.handleError(url, method, response);
    }
}

从上面的代码可以看到是使用了RestTemplate的错误处理器,所以我们就可以想办法自定义错误处理器;

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory){
    RestTemplate restTemplate = new RestTemplate(factory);
    ResponseErrorHandler responseErrorHandler = new ResponseErrorHandler() {
        @Override
        public boolean hasError(ClientHttpResponse response) throws IOException {
            return true;
        }
        @Override
        public void handleError(ClientHttpResponse response) throws IOException {
        }
    };
    restTemplate.setErrorHandler(responseErrorHandler);
    return restTemplate;
}zhi

只需要将hasError方法的返回值更改为true就可以了,以后不管状态码是200还是其它的都会返回结果;

2.设置超时时间

RestTemplate默认使用的是SimpleClientHttpRequestFactory工厂方法,看下它的超时时间是:

?
1
2
private int connectTimeout = -1;
private int readTimeout = -1;

默认值都是-1,也就是没有超时时间;

其底层是使用URLConnection,而URLConnection实际上时封装了Socket,Socket我们知道是没有超时时间限制的,所以我们必须设置超时时间,否则如果请求的URL一直卡死程序将会不可以运行下去;

?
1
2
3
4
5
6
7
8
9
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
    SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
    //读取超时5秒,默认无限限制,单位:毫秒
    factory.setReadTimeout(5000);
    //连接超时10秒,默认无限制,单位:毫秒
    factory.setConnectTimeout(10000);
    return factory;
}

以上就是RestTemplate设置超时时间及返回状态码非200处理的详细内容,更多关于RestTemplate超时设置非200处理的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/yaomingyang/article/details/102636568

延伸 · 阅读

精彩推荐