resttemplate捕获异常,resttemplate请求超时处理

  resttemplate捕获异常,resttemplate请求超时处理

  00-1010前言1、异常2、源代码分析-默认实现3、RestTemplate自定义异常处理

  00-1010本文是关于RestTemplate的第7篇文章。上一篇文章的博客访问地址如下:

  RestTemplate采用春季或非春季环境下的强化授课。

  RestTemplate实现了各种底层HTTP客户端类库的切换使用。

  解释如何使用RestTemplate发送HTTPGET请求

  解释如何使用RestTemplate发送HTTPPOST请求

  RestTemplate的请求方法,比如DELETE和PUT,使用了密集授课。

  RestTemplate文件的上传和下载以及大文件的流式下载

  00-1010使用RestTemplate调用远程接口服务时,被请求的服务异常时:超时、服务不存在等。(响应状态不是200,而是400,500HTTP状态代码),将引发以下异常:

  我模拟了这个异常,并将正确的请求服务地址从“/posts/1”更改为“/posts/1”。该服务不存在,因此会引发404异常。

  @ test public void test entity(){ String URL= http://jsonplaceholder . typicode.com/postss/1 ;response entity string response entity=rest template . getforentity(URL,string . class);//这一行抛出异常。//下面两行代码不能执行http status status code=response entity . get status code();//获取响应代码System.out.println(HTTP响应状态: status code );}异常抛出后,程序后面的代码无法执行,后面的代码也无法执行。在实际的业务开发中,有时候我们期望的是应该得到最终的请求结果(HTTP请求结果状态400,500),而不管你的服务器是否超时或者服务是否不存在,而不是得到一个抛出的异常。

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

  errorhandler是RestTemplate请求结果的异常处理程序接口。

  接口的第一个方法hasError用于判断HttpResponse是否为异常响应(通过状态码),接口的第二个方法handleError用于处理异常响应结果(非200状态码段)。DefaultResponseErrorHandler是ResponseErrorHandler的默认实现。

  所以我们来看看DefaultResponseErrorHandler是如何处理异常响应的。从HttpResponse解析Http StatusCode,如果StatusCode状态代码为null,则会引发未知的HttpStatusCodeException异常。

  如果StatusCode存在,则解析StatusCode的系列,即状态码段(除200段外,其他均为异常状态码),解析规则为StatusCode/100取整。

  公共枚举系列{Informational (1),//1xx/100Successful (2),//2xx/100Redirect (3),//3xx/100Client _ Error (4),//4xx/100,客户端异常SERVER _ Error(5);//5xx/100,服务器端异常}通过抛出HttpClientErrorException进一步处理客户端异常和服务器端异常。也就是第一节出现异常的原因。

  00-1010所以我们需要实现自定义异常,只需实现ResponseErrorHandler接口即可。

  公共类MyRestErrorHandler实现ResponseErrorHandler { /** *判断返回结果反应是否是异常结果* 主要是去检查反应的超文本传送协议状态*仿造默认响应错误处理程序实现即可*/@覆盖公共布尔hasError(ClientHttpResponse响应)抛出io异常{ int rawStatusCode=response。getrawstatuscode();http status状态代码=http status。解决(原始状态代码);return (statusCode!=null?状态代码。iserror(): hasError(rawStatusCode));}受保护的布尔型hasError(int未知状态代码){ http status .系列系列=HttpStatus .系列。解决(未知状态代码);return (series==HttpStatus .系列。CLIENT _ ERROR series==http状态.系列。SERVER _ ERROR);} @覆盖公共void句柄错误(ClientHttpResponse响应)引发IOException { //里面可以实现你自己遇到了错误进行合理的处理//TODO将接口请求的异常信息持久化}}将MyRestErrorHandler在客户端实例化的时候进行注册。

  参考:

  客户端在弹簧或非弹簧环境下使用精讲

  客户端实现多种底层超文本传送协议客户端类库的切换用法

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

  以上就是客户端自定义请求失败异常处理示例解析的详细内容,更多关于客户端自定义请求失败异常处理的资料请关注盛行信息技术其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: