如何实现基于okhttp3的重定向请求和改进



我使用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;
}

最新更新