我使用okhttp3和改造作为android项目请求框架,我有一个应用场景如下:
在我们的项目中有两个服务器,有两个域;我们想要做的是,当连接到一个服务器失败时,我们在一个请求中重新连接到另一个服务器,所以我们使用okhttp3拦截器,如下所示:
public Response intercept(Chain chain) {
Request request = chain.request();
Response response = chain.proceed(request);
int tryCount = 0;//retry times
int RetryCount = 3;
while (!response.isSuccessful() && tryCount <= RetryCount) {
String url = request.url().toString();
if (!Util.checkNULL(FirstIP) && !Util.checkNULL(SecondIP)) {
if (url.contains(FirstIP)) {//change url
url = url.replace(FirstIP, SecondIP);
} else if (url.contains(SecondIP)) {
url = url.replace(SecondIP, FirstIP);
}
Request newRequest = response.request().newBuilder().url(url).build();//recreate request
tryCount++;//add request count
response = chain.proceed(newRequest);//retry the request
} else {
response = chain.proceed(request);
}
}
return response;
}
但是这句话有一个错误:
Response = chain.proceed(request);
当url无法连接时,这句话会抛出异常,所以这不会使重试工作如预期,有什么解决办法吗?提前感谢!
我做了如下的变通:
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
// try the request
Response response = doRequest(chain,request);
int tryCount = 0;
while (response == null && tryCount <= RetryCount) {
String url = request.url().toString();
url = switchServer(url);
Request newRequest = request.newBuilder().url(url).build();
tryCount++;
// retry the request
response = doRequest(chain,newRequest);
}
if(response == null){//important ,should throw an exception here
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;
}