尊重他人的劳动成果,转载请标明出处: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重试拦截器相关推荐

  1. tp监控连接云路由服务器失败_tp-link云路由器界面提示“发送请求失败,请重试”怎么办?...

    在创建.登录.注销TP-LINK ID时,或者在找回TP-LINK ID的密码.在线升级.刷新精选应用等与云服务有关操作时,云路由器或APP界面可能提示 发送请求失败,请重试,如下图. 出现该问题后, ...

  2. springmvc拦截器对请求参数解密_springMvc使用拦截器自定义处理参数

    前言: 这两天开发遇到一个需求,那就是在后台接收到请求后,能不能自定义添加参数呢? 我们知道request中是能获取到前端获取的参数的,但是在后端不能再往parameter中添加参数了,虽然可以使用r ...

  3. okhttp原理分析(持续更新),包含okio了解,拦截器以及断点下载的使用

    1. 原理 1. okio 最基本的接口只有两个:Sink(writer).Source(Read),大概相当于OutputStream和InputStream在原生接口中的地位.这两个接口中只定义了 ...

  4. Spring自定义数据源配置不当引起的Mybatis拦截器Interceptors 失效/不生效

    目录 内容 Interceptor接口与@Intercepts注解 PageHelper实现拦截器 默认数据源与拦截器 自定义数据源与拦截器的问题 自定义数据源注入拦截器 内容 Interceptor ...

  5. 监听器——Listener(简述、自定义监听器) 略,过滤器与拦截器

    文章目录 监听器 自定义监听器 过滤器与拦截器 监听器 略,不怎么使用了. 见名知意,比如你上课玩手机,亲爱的班主任静悄悄地出现在你身后.你就是"被监听的对象",班主任就" ...

  6. springboot拦截请求路径_springboot之路径拦截器

    方式一:不推荐,在代码中添加路径 1.写一个拦截器,继承HandlerInterceptor类 importorg.springframework.stereotype.Component;impor ...

  7. OKHttp五大拦截器

    文章目录 [1]五大拦截器总体概述 一.责任链设计模式 ①定义: ②为什么要使用责任链模式 [2]拦截器的工作流程 一.默认的5大拦截器有哪些? [3]RetryAndFollowUpIntercep ...

  8. Android—OkHttp同步异步请求过程源码分析与拦截器

    OkHttp同步请求步骤: 创建OkHttpClient,客户对象 创建Request,请求主体,在请求主体设置请求的url,超时时间等 用newCall(request)将Reuqest对象封装成C ...

  9. OkHttp 3.x 源码解析之Interceptor 拦截器

    拦截器 Java里的拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提 ...

最新文章

  1. swift 进入后台或者点击home键是程序进入后台后,持续定位
  2. javascript定时器
  3. myeclipse转maven项目
  4. 《Go语言圣经》学习笔记 第四章 复合数据类型
  5. Linux记录-salt命令
  6. PHP常用的自定义函数
  7. dotnet core 开发无缝兼容Http和Websocket协议的接口服务
  8. c语言爬虫和python爬虫_为什么写爬虫都喜欢用python?
  9. php实现ssh客户端,php无阻塞SSH客户端实例
  10. jediscluster的maxAttempts的理解
  11. 我再也不-或许永远不-用zend studio-受够了!
  12. Qt总结之二十二:Qt控件QObject
  13. LINUX SHELL脚本的if语句实在是诡异
  14. 噢,原来SpringCloud是这样的呀!
  15. 在pc计算机vga是什么意思,电脑上的VGA线是什么样的?图片
  16. 费马小定理和欧拉定理
  17. 谷歌翻译器-在线实时批量谷歌翻译器
  18. 【翻译】我们为什么要关注AIOps?
  19. CentOS7 下MariaDB安装与简单配置(最新)
  20. 编译的时候所使用的动态库中出现错误:未定义的引用

热门文章

  1. PHP 开发社区微信服务号实战图解
  2. 三面蚂蚁金服成功拿到offer,成功收获美团,小米offer
  3. 【报错】fatal: unable to access
  4. Kindle支持文档类型
  5. android 蓝牙触控笔,FiftyThree 53 Paper pencil 电容笔蓝牙触控笔 上手试用
  6. Linux 将普通用户改成root用户
  7. 松下A6伺服驱动器MADLN15SE与欧姆龙PLC的连接和试运行
  8. 2020年网络工程师发展前景如何
  9. csdn博客使用反馈,bug
  10. 计算机操作系统(第四版)第二章(进程的描述与控制)知识点整理