[Android]Retrofit多base_url請求解決方案

在項(xiàng)目中偶爾會碰到多base_url的情況,其實(shí)這個做法很討厭,但是后端又沒辦法才這樣做的,當(dāng)使用retrofit作為網(wǎng)絡(luò)框架的時候,出現(xiàn)多base_url的情況又很麻煩,下面提供我解決的方案
在ApiService處

    public static String URL_1="url_name:url_1";
    public static String URL_2="url_name:url_2";

    /**
     * 登陸
     *
     * @param map
     * @return
     */

    @Headers({URL_1})
    @FormUrlEncoded
    @POST("/Account/Login/")
    Observable<JsonObjBase<LoginBean>> login(@FieldMap Map<String, String> map);

    /**
     * 登出
     *
     * @param map
     * @return
     */
    @Headers({URL_2})
    @FormUrlEncoded
    @POST("/Account/Logout/")
    Observable<JsonObjBase> logout(@FieldMap Map<String, String> map);

增加多url的headers,例如:url_1/url_2
然后在Retrofit的實(shí)體類中,增加Interceptor

        Interceptor baseUrlInterceptor = new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                // 獲取request
                Request request = chain.request();
                // 從request中獲取原有的HttpUrl實(shí)例oldHttpUrl
                HttpUrl oldHttpUrl = request.url();
                // 獲取request的創(chuàng)建者builder
                Request.Builder builder = request.newBuilder();
                // 從request中獲取headers,通過給定的鍵url_name
                List<String> headerValues = request.headers("url_name");
                if (headerValues != null && headerValues.size() > 0) {
                    // 如果有這個header,先將配置的header刪除,因此header僅用作app和okhttp之間使用
                    builder.removeHeader("url_name");
                    // 匹配獲得新的BaseUrl
                    String headerValue = headerValues.get(0);
                    Log.d("headerValue", headerValue);
                    HttpUrl newBaseUrl = null;
                    if ("url_1".equals(headerValue)) {
                        newBaseUrl = HttpUrl.parse(Constants.BASE_URL_1);
                    } else if ("url_2".equals(headerValue)) {
                        newBaseUrl = HttpUrl.parse(Constants.BASE_URL_2);
                    }else {
                        newBaseUrl = oldHttpUrl;
                    }
                    // 重建新的HttpUrl,修改需要修改的url部分
                    HttpUrl newFullUrl = oldHttpUrl
                            .newBuilder()
                            // 更換網(wǎng)絡(luò)協(xié)議
                            .scheme(newBaseUrl.scheme())
                            // 更換主機(jī)名
                            .host(newBaseUrl.host())
                            // 更換端口
                            .port(newBaseUrl.port())
                            .build();
                    // 重建這個request,通過builder.url(newFullUrl).build();
                    // 然后返回一個response至此結(jié)束修改
                    return chain.proceed(builder.url(newFullUrl).build());
                }
                return chain.proceed(request);

            }
        };

通過 String headerValue = headerValues.get(0); 獲得 headerValue 然后判斷 headerValue 的值去更改url,同理方法也能更改端口號等別的信息
然后在初始化OkHttpClient的時候?qū)nterceptor添加上

            //初始化一個OkHttpClient
            OkHttpClient.Builder builder = new OkHttpClient.Builder()
                    .connectTimeout(30000, TimeUnit.MILLISECONDS)
                    .readTimeout(30000, TimeUnit.MILLISECONDS)
                    .writeTimeout(30000, TimeUnit.MILLISECONDS);
            builder.addInterceptor(interceptor);
            builder.addInterceptor(baseUrlInterceptor);
            OkHttpClient okHttpClient = builder.build();
            interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
            //使用該OkHttpClient創(chuàng)建一個Retrofit對象
            mRetrofit = new Retrofit.Builder()
                    //添加Gson數(shù)據(jù)格式轉(zhuǎn)換器支持
                    .addConverterFactory(GsonConverterFactory.create())
                    //添加RxJava語言支持
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    //指定網(wǎng)絡(luò)請求client
                    .client(okHttpClient)
                    .baseUrl(BASE_URL)
                    .build();

最后再去試試網(wǎng)絡(luò)請求看看


result.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容