okhttp之自定义Interceptor:请求失败切换IP重试拦截器
2018-07-03 15:33
3051 查看
尊重他人的劳动成果,转载请标明出处:https://www.geek-share.com/detail/2682079571.html, 本文出自:【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; } @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); // try the request Response 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 request response = chain.proceed(newRequest); } else { response = chain.proceed(request); } } return response; } }
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; } @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); // try the request Response 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 request response = 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 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();阅读更多
相关文章推荐
- okhttp之自定义Interceptor:请求失败切换IP重试拦截器
- 自定义OKhttp拦截器 添加请求头
- Android——自定义拦截器实现OKHttp网络请求
- OkHttp - 拦截器(Interceptor) 重新定义请求 Request
- Android——自定义拦截器实现OKHttp网络请求
- CXF拦截器Interceptor实现自定义消息,并以json格式返回
- Web Service (006---使用eclipse端口拦截器[TCP/IP Monitor]监视WebService请求)
- OkHttp自定义重试次数
- flume开发-自定义拦截器(Interceptor)
- Rx系列学习笔记_使用okhttp拦截器统一处理返回请求
- 自定义的拦截器,封装公共参数 get请求
- okhttp 日志拦截器Logging-interceptor
- SSH-Struts2简单的自定义拦截器MethodFilterInterceptor
- flume开发-自定义拦截器(Interceptor)
- springboot-12-自定义拦截器的配置interceptor
- retrofit2.0使用拦截器Interceptor统一打印请求与响应的json
- OkHttp框架的RetryAndFollowUpInterceptor请求重定向源码解析
- 给retrofit 的 添加okhttp的拦截器,可以让她显示 请求和返回的信息 ,便于查找错误
- Android的OkHttp包中的HTTP拦截器Interceptor用法示例
- retrofit2.0使用拦截器Interceptor统一打印请求与响应的json