Android APP okhttp網絡請求框架更換多個baseUrl

主要思路是請求url時加個請求頭,然後在攔截器裏通過本次請求的請求頭來判斷使用對應的baseUrl。

主要代碼


import com.xxx.xxx.MyClient;

import java.io.IOException;
import java.util.List;

import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;

public class MulBaseUrlInterceptor implements Interceptor {

    public MulBaseUrlInterceptor() {

    }

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        //獲取處理後的新newRequest
        Request newRequest;
        //獲取老的url
        HttpUrl oldUrl = request.url();
        //獲取originalRequest的創建者builder
        Request.Builder builder = request.newBuilder();
        // 獲取頭信息的集合
        List<String> urlTypeList = request.headers(MyClient.URL_TYPE_KEY);
        if (urlTypeList != null && urlTypeList.size() > 0) {
            //刪除原有配置中的值,就是namesAndValues集合裏的值
            builder.removeHeader(MyClient.URL_TYPE_KEY);
            //獲取頭信息中配置的value
            String headerValueFirst = urlTypeList.get(0);
            //根據頭信息中配置的value,來匹配新的base_url地址
            HttpUrl baseURL = null;
            //重建新的HttpUrl,需要重新設置的url部分
            String oldUrlStr = oldUrl.toString();
            String oldUrlHost = oldUrl.host();
            int oldUrlHostIndex = oldUrlStr.indexOf(oldUrlHost);
            int oldUrlStrLength = oldUrlHost.length();
            switch (headerValueFirst) {
                case MyClient.URL_TYPE_VALUE_MIDDLE: // 第一種
                    baseURL = HttpUrl.parse(MyClient.getMiddleUrl() + oldUrlStr.substring(oldUrlHostIndex + oldUrlStrLength+1));
                    break;
                case MyClient.URL_TYPE_VALUE_TASK: // 第二種
                    baseURL = HttpUrl.parse(MyClient.getTaskUrl() + oldUrlStr.substring(oldUrlHostIndex + oldUrlStrLength+1));
                    break;
                case MyClient.URL_TYPE_VALUE_BASE: // 第三種
                    baseURL = HttpUrl.parse(MyClient.getStorageUrl() + oldUrlStr.substring(oldUrlHostIndex + oldUrlStrLength+1));
                    break;
            }
            if (baseURL != null) {
                newRequest = builder.url(baseURL).build();
            } else {
                newRequest = request;
            }
        } else {
            newRequest = request;
        }

        Response response = chain.proceed(newRequest);

        return response;
    }
}

第二步,使用這個攔截器

  • addInterceptor(new MulBaseUrlInterceptor())即可
private static Retrofit getMyRetrofit() {
        SSLSocketFactory sslSocketFactory = getSSLSocketFactory();
        if(retrofit == null) {
            okHttpClient = sOkHttpBuilder
                    .readTimeout(60L, TimeUnit.SECONDS)// 讀取超時
                    .writeTimeout(60L, TimeUnit.SECONDS)// 寫入超時
                    .connectTimeout(60L, TimeUnit.SECONDS)// 連接超時
                    .addInterceptor(new XxxInterceptor())
                    .addInterceptor(new XxxInterceptor(1))
                    .addInterceptor(new MulBaseUrlInterceptor())
                    .sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0])
                    .hostnameVerifier(new HostnameVerifier() {
                        @Override
                        public boolean verify(String hostname, SSLSession session) {
                            return true;
                        }
                    })
                    .build();
            retrofit = new Retrofit.Builder()
                    .baseUrl(getOperationUrl())
                    .client(okHttpClient)
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章