【问题标题】:How to do the redirect request based on okhttp3 and retrofit如何基于okhttp3和改造做重定向请求
【发布时间】:2016-08-15 16:45:09
【问题描述】:

我使用okhttp3和retrofit作为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;
    }

但是这句话有一个错误:

响应响应 = chain.proceed(request);

这句话会在url无法连接的时候抛出异常,所以这不会让重试按预期工作,有什么解决方法吗?提前谢谢!

【问题讨论】:

    标签: android retrofit2 okhttp3


    【解决方案1】:

    我做了如下解决方法:

    @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;
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 2011-09-29
      • 2021-10-26
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      相关资源
      最近更新 更多