千家信息网

RestTemplate自定义请求失败异常如何处理

发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,今天小编给大家分享一下RestTemplate自定义请求失败异常如何处理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有
千家信息网最后更新 2024年11月11日RestTemplate自定义请求失败异常如何处理

今天小编给大家分享一下RestTemplate自定义请求失败异常如何处理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

一、异常现象

在使用RestTemplate进行远程接口服务调用的时候,当请求的服务出现异常:超时、服务不存在等情况的时候(响应状态非200、而是400、500HTTP状态码),就会抛出如下异常:

该异常我是模拟出来的,将正确的请求服务地址由"/posts/1"改成"/postss/1"。服务不存在所以抛出404异常。

@Testpublic void testEntity() {   String url = "http://jsonplaceholder.typicode.com/postss/1";   ResponseEntity responseEntity               = restTemplate.getForEntity(url, String.class);  //这行抛出异常   //下面两行代码执行不到   HttpStatus statusCode = responseEntity.getStatusCode(); // 获取响应码   System.out.println("HTTP 响应状态:" + statusCode);}

异常抛出之后,程序后面的代码就执行不到了,无法进行后面的代码执行。实际的业务开发中,有的时候我们更期望的结果是:不管你服务端是超时了还是服务不存在,我们都应该获得最终的请求结果(HTTP请求结果状态400、500),而不是获得一个抛出的异常。

二、源码解析-默认实现

首先我要说一个结论:RestTemplate请求结果异常是可以自定义处理的。在开始进行自定义的异常处理逻辑之前,我们有必要看一下异常处理的默认实现。也就是:为什么会产生上面小节提到的现象?

ResponseErrorHandler是RestTemplate请求结果的异常处理器接口

  • 接口的第一个方法hasError用于判断HttpResponse是否是异常响应(通过状态码)

  • 接口的第二个方法handleError用于处理异常响应结果(非200状态码段)

DefaultResponseErrorHandler是ResponseErrorHandler的默认实现

所以我们就来看看DefaultResponseErrorHandler是如何来处理异常响应的?从HttpResponse解析出Http StatusCode,如果状态码StatusCode为null,就抛出UnknownHttpStatusCodeException异常。

如果StatusCode存在,则解析出StatusCode的series,也就是状态码段(除了200段,其他全是异常状态码),解析规则是StatusCode/100取整。

public enum Series {   INFORMATIONAL(1),  // 1xx/100   SUCCESSFUL(2),  // 2xx/100   REDIRECTION(3), // 3xx/100   CLIENT_ERROR(4), // 4xx/100   ,客户端异常   SERVER_ERROR(5); // 5xx/100 ,服务端异常}

进一步针对客户端异常和服务端异常进行处理,处理的方法是抛出HttpClientErrorException。也就是第一小节出现的异常的原因

三、RestTemplate自定义异常处理

所以我们要实现自定义异常,实现ResponseErrorHandler 接口就可以。

public class MyRestErrorHandler implements ResponseErrorHandler {    /**     * 判断返回结果response是否是异常结果     * 主要是去检查response 的HTTP Status     * 仿造DefaultResponseErrorHandler实现即可     */    @Override    public boolean hasError(ClientHttpResponse response) throws IOException {        int rawStatusCode = response.getRawStatusCode();        HttpStatus statusCode = HttpStatus.resolve(rawStatusCode);        return (statusCode != null ? statusCode.isError(): hasError(rawStatusCode));    }    protected boolean hasError(int unknownStatusCode) {        HttpStatus.Series series = HttpStatus.Series.resolve(unknownStatusCode);        return (series == HttpStatus.Series.CLIENT_ERROR || series == HttpStatus.Series.SERVER_ERROR);    }    @Override    public void handleError(ClientHttpResponse response) throws IOException {        // 里面可以实现你自己遇到了Error进行合理的处理        //TODO 将接口请求的异常信息持久化    }}

将MyRestErrorHandler 在RestTemplate实例化的时候进行注册。

参考:

RestTemplate在Spring或非Spring环境下使用精讲

RestTemplate实现多种底层HTTP客户端类库的切换用法

这时再去执行第一小节中的示例代码,就不会抛出异常。而是得到一个HTTP Status 404的结果。我们可以根据这个结果,在程序中继续向下执行代码。

以上就是"RestTemplate自定义请求失败异常如何处理"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

结果 处理 状态 服务 接口 代码 时候 知识 篇文章 也就是 客户 客户端 方法 内容 现象 程序 而是 逻辑 参考 不同 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 怎么开启自动连接服务器 数据库技术在当前社会上的应用 数据库防火墙命令阻断 如何预防网络安全威胁 数据库中怎么发现联系 生活中还有其他网络安全 打印机服务器纸尺寸 上海香航网络技术公司招聘 网络安全就图一乐 公司安全数据库设计 2台电脑数据库数据互通 瑞达教育服务器的证书无效 东华软件和华为服务器 固网服务器终端说明书 北京互联网网络技术服务口碑推荐 数据库创建多列索引 易家旅北京网络技术有限公司 软件开发编码的软件测试是 创建数据库表之间的关系图; 多个微信小程序共用一个云数据库 1万块钱的苹果五的数据库 热场仿真模拟软件开发公司 闵行区服务软件开发参考价格 数据库的备份计算机80G 网易 数据库下载地址 下载计算机网络技术毕业论文 我的世界服务器怎么用副手 湖北系统软件开发机构 网络安全对维稳的重要性 访客网络安全么
0