okhttp之自定义Interceptor:请求失败切换IP重试拦截器
尊重他人的劳动成果,转载请标明出处:http://blog.csdn.net/gengqiquan/article/details/52200393, 本文出自:【gengqiquan的博客】
经过一段时间的挣扎,终于把新公司项目的网络框架换成了retrofit,由于项目是有失败重试和重定向需求的,所以需要在新的网络框架上增加这个功能,大家都知道retrofit的网络请求部分是基于okhttp的。这个时候可爱的Interceptor设计就提现出他的好处了,不需要修改其他的代码,直接增加一个拦截器就OK了
实现一个拦截器继承Interceptor(2.0到3.0之前的版本)
public class RetryAndChangeIpInterceptor implements Interceptor {String FirstIP;String SecondIP;int RetryCount;public RetryAndChangeIpInterceptor(String firsrIP, String secondIP, int tryCount) {FirstIP = firsrIP;SecondIP = secondIP;RetryCount = tryCount;}public RetryAndChangeIpInterceptor(String firsrIP, String secondIP) {FirstIP = firsrIP;SecondIP = secondIP;RetryCount = 3;}@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();// try the requestResponse response = chain.proceed(request);int tryCount = 0;while (!response.isSuccessful() && tryCount <= RetryCount) {String url = request.url().toString();if (!Util.checkNULL(FirstIP) && !Util.checkNULL(SecondIP)) {//重定向if (url.contains(FirstIP)) {url = url.replace(FirstIP, SecondIP);} else if (url.contains(SecondIP)) {url = url.replace(SecondIP, FirstIP);}Request newRequest = response.request().newBuilder().url(url).build();Log.d("intercept", "Request is not successful - " + tryCount);tryCount++;// retry the requestresponse = chain.proceed(newRequest);} else {response = chain.proceed(request);}}return response;}
}
3.0及以上版本(取消了httpEngine,采用了纯拦截器递归调用机制)
package com.sunshine.retrofit.interceptor;import android.util.Log;import java.io.IOException;
import java.util.List;import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;/*** Created by 耿 on 2016/8/12.*/
public class RetryAndChangeIpInterceptor implements Interceptor {int RetryCount = 3;String FirstIP;List<String> SERVERS;public RetryAndChangeIpInterceptor(String firsrIP, List<String> sERVERS) {FirstIP = firsrIP;SERVERS = sERVERS;RetryCount = 3;}public RetryAndChangeIpInterceptor(String firsrIP, List<String> sERVERS, int tryCount) {FirstIP = firsrIP;SERVERS = sERVERS;RetryCount = tryCount;}@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();// try the requestResponse response = doRequest(chain, request);int tryCount = 0;String url = request.url().toString();while (response == null && tryCount <= RetryCount) {url = switchServer(url);Request newRequest = request.newBuilder().url(url).build();Log.d("intercept", "Request is not successful - " + tryCount);tryCount++;// retry the requestresponse = doRequest(chain, newRequest);}if (response == null) {throw new IOException();}return response;}private Response doRequest(Chain chain, Request request) {Response response = null;try {response = chain.proceed(request);} catch (Exception e) {}return response;}private String switchServer(String url) {String newUrlString = url;if (url.contains(FirstIP)) {for (String server : SERVERS) {if (!FirstIP.equals(server)) {newUrlString = url.replace(FirstIP, server);break;}}} else {for (String server : SERVERS) {if (url.contains(server)) {newUrlString = url.replace(server, FirstIP);break;}}}return newUrlString;}}
配置OkHttpClient
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new RetryAndChangeIpInterceptor(BASE_URL, SecondIP))//添加失败重试及重定向拦截器.retryOnConnectionFailure(true)//允许失败重试.connectTimeout(8, TimeUnit.SECONDS).readTimeout(5, TimeUnit.SECONDS).writeTimeout(5, TimeUnit.SECONDS).build();
我建了一个QQ群(群号:121606151),用于大家讨论交流Android技术问题,有兴趣的可以加下,大家一起进步。
okhttp之自定义Interceptor:请求失败切换IP重试拦截器相关推荐
- tp监控连接云路由服务器失败_tp-link云路由器界面提示“发送请求失败,请重试”怎么办?...
在创建.登录.注销TP-LINK ID时,或者在找回TP-LINK ID的密码.在线升级.刷新精选应用等与云服务有关操作时,云路由器或APP界面可能提示 发送请求失败,请重试,如下图. 出现该问题后, ...
- springmvc拦截器对请求参数解密_springMvc使用拦截器自定义处理参数
前言: 这两天开发遇到一个需求,那就是在后台接收到请求后,能不能自定义添加参数呢? 我们知道request中是能获取到前端获取的参数的,但是在后端不能再往parameter中添加参数了,虽然可以使用r ...
- okhttp原理分析(持续更新),包含okio了解,拦截器以及断点下载的使用
1. 原理 1. okio 最基本的接口只有两个:Sink(writer).Source(Read),大概相当于OutputStream和InputStream在原生接口中的地位.这两个接口中只定义了 ...
- Spring自定义数据源配置不当引起的Mybatis拦截器Interceptors 失效/不生效
目录 内容 Interceptor接口与@Intercepts注解 PageHelper实现拦截器 默认数据源与拦截器 自定义数据源与拦截器的问题 自定义数据源注入拦截器 内容 Interceptor ...
- 监听器——Listener(简述、自定义监听器) 略,过滤器与拦截器
文章目录 监听器 自定义监听器 过滤器与拦截器 监听器 略,不怎么使用了. 见名知意,比如你上课玩手机,亲爱的班主任静悄悄地出现在你身后.你就是"被监听的对象",班主任就" ...
- springboot拦截请求路径_springboot之路径拦截器
方式一:不推荐,在代码中添加路径 1.写一个拦截器,继承HandlerInterceptor类 importorg.springframework.stereotype.Component;impor ...
- OKHttp五大拦截器
文章目录 [1]五大拦截器总体概述 一.责任链设计模式 ①定义: ②为什么要使用责任链模式 [2]拦截器的工作流程 一.默认的5大拦截器有哪些? [3]RetryAndFollowUpIntercep ...
- Android—OkHttp同步异步请求过程源码分析与拦截器
OkHttp同步请求步骤: 创建OkHttpClient,客户对象 创建Request,请求主体,在请求主体设置请求的url,超时时间等 用newCall(request)将Reuqest对象封装成C ...
- OkHttp 3.x 源码解析之Interceptor 拦截器
拦截器 Java里的拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提 ...
最新文章
- swift 进入后台或者点击home键是程序进入后台后,持续定位
- javascript定时器
- myeclipse转maven项目
- 《Go语言圣经》学习笔记 第四章 复合数据类型
- Linux记录-salt命令
- PHP常用的自定义函数
- dotnet core 开发无缝兼容Http和Websocket协议的接口服务
- c语言爬虫和python爬虫_为什么写爬虫都喜欢用python?
- php实现ssh客户端,php无阻塞SSH客户端实例
- jediscluster的maxAttempts的理解
- 我再也不-或许永远不-用zend studio-受够了!
- Qt总结之二十二:Qt控件QObject
- LINUX SHELL脚本的if语句实在是诡异
- 噢,原来SpringCloud是这样的呀!
- 在pc计算机vga是什么意思,电脑上的VGA线是什么样的?图片
- 费马小定理和欧拉定理
- 谷歌翻译器-在线实时批量谷歌翻译器
- 【翻译】我们为什么要关注AIOps?
- CentOS7 下MariaDB安装与简单配置(最新)
- 编译的时候所使用的动态库中出现错误:未定义的引用