【Android架構(gòu)】基于MVP模式的Retrofit2+RXjava封裝之多Url(七)

前言

最近好幾個(gè)朋友問我眠寿,多Url怎么處理落恼,這里我們就說說這個(gè)。

套路一

Retrofit2是支持全路徑的,比如說

 @GET("http://api.csslcloud.net/api/room/create")
 Observable<String> createRoom(@Path("param") String param);

所以羞芍,項(xiàng)目中只有個(gè)別接口需要的話堂竟,完全可以使用配置全路徑這種方式魂毁。

套路二

保留多個(gè)Retrofit對(duì)象
在之前的代碼中,Retrofit一直是單例的出嘹,這里我們可以創(chuàng)建2個(gè)Retrofit對(duì)象

  retrofit = new Retrofit.Builder()
                .baseUrl(BASE_SERVER_URL)
                .addConverterFactory(BaseConverterFactory.create())
                //支持RxJava2
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(client)
                .build();

        retrofit2 = new Retrofit.Builder()
                .baseUrl(BASE_SERVER_URL2)
                .addConverterFactory(BaseConverterFactory.create())
                //支持RxJava2
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(client)
                .build();

        apiServer = retrofit.create(ApiServer.class);

        apiServer2 = retrofit2.create(ApiServer.class);

然后在使用時(shí)席楚,區(qū)分

    /**
     * 獲取微分享列表
     */
    public void getShareList() {
        ...省略代碼...
        ApiServer apiServer = ApiRetrofit2.getInstance().getApiService();
        ...省略代碼...
    }

    /**
     * 獲取微分享列表
     */
    public void getShareList2() {
      ...省略代碼...
        ApiServer apiServer = ApiRetrofit2.getInstance().getApiService2();
        ...省略代碼...
    }

當(dāng)然這里也就說說而已,估計(jì)沒人會(huì)這么用...

套路三

JessYan 大神曾提過另外一種方案税稼,原文地址

思路是烦秩,通過Okhttp的攔截器,動(dòng)態(tài)改變接口的地址郎仆,那攔截器里如何知道每個(gè)接口該使用哪個(gè)主地址呢只祠?
這里可以使用head,請(qǐng)求時(shí)丸升,添加固定的標(biāo)志head铆农,然后在攔截器中判斷,完成替換狡耻。

如何實(shí)現(xiàn)

首先期揪,在ApiServer 中定義接口界轩,添加head

    /**
     * 獲取分享列表
     *
     * @return
     */
    @FormUrlEncoded
    @POST("module/index.php?")
    @Headers({"url_mark:1"})
    Observable<List<ShareModel>> getShareList2(@FieldMap Map<String, String> map);

    /**
     * 獲取分享列表
     *
     * @return
     */
    @FormUrlEncoded
    @POST("module/index.php?")
    @Headers({"url_mark:2"})
    Observable<List<ShareModel>> getShareList3(@FieldMap Map<String, String> map);

然后在Interceptor判斷head

    private Interceptor interceptor = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();

            Log.e(TAG, "----------Request Start----------------");
            Log.e(TAG, "| OldUrl=" + request.url().toString());
            List<String> mark = request.headers("url_mark");

            HttpUrl newUrl = null;
            if (mark != null && mark.size() > 0) {
                Log.e(TAG, "| Head=" + mark.get(0));
                if (mark.get(0).equals("1")) {
                    newUrl = HttpUrl.parse("http://www.baidu.com/");
                } else if (mark.get(0).equals("2")) {
                    newUrl = HttpUrl.parse("http://www.github.com/");
                } else {
                    newUrl = request.url();
                }
                request = request.newBuilder().url(newUrl).build();
            }


            Log.e(TAG, "| NewUrl=" + request.url().toString());

            long startTime = System.currentTimeMillis();
            Response response = chain.proceed(request);
            long endTime = System.currentTimeMillis();
            long duration = endTime - startTime;
            MediaType mediaType = response.body().contentType();
            String content = response.body().string();


            Log.e(TAG, "| " + request.toString());
            Log.e(TAG, "| Response:" + content);
            Log.e(TAG, "----------Request End:" + duration + "毫秒----------");
            return response.newBuilder()
                    .body(ResponseBody.create(mediaType, content))
                    .build();
        }
    };

結(jié)果如下:


image.png

當(dāng)然,這里是寫死的判斷茬贵,實(shí)際開發(fā)中郊霎,可能是提前知道或者接口返回具體哪些接口地址沼头,可以存放在Map中,這里直接取值就好书劝。

最后进倍,獻(xiàn)上源碼 Github

參考 RetrofitUrlManager

RetrofitUrlManager 還提供了了更加豐富的替換規(guī)則,詳情可以查看源碼购对。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末猾昆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子骡苞,更是在濱河造成了極大的恐慌垂蜗,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件解幽,死亡現(xiàn)場離奇詭異贴见,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)躲株,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門片部,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人霜定,你說我怎么就攤上這事档悠±扰福” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵站粟,是天一觀的道長黍图。 經(jīng)常有香客問我,道長奴烙,這世上最難降的妖魔是什么助被? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮切诀,結(jié)果婚禮上揩环,老公的妹妹穿的比我還像新娘。我一直安慰自己幅虑,他們只是感情好丰滑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著倒庵,像睡著了一般褒墨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上擎宝,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天郁妈,我揣著相機(jī)與錄音,去河邊找鬼绍申。 笑死噩咪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的极阅。 我是一名探鬼主播胃碾,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼筋搏!你這毒婦竟也來了仆百?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤拆又,失蹤者是張志新(化名)和其女友劉穎儒旬,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帖族,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡栈源,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了竖般。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甚垦。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出艰亮,到底是詐尸還是另有隱情闭翩,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布迄埃,位于F島的核電站疗韵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏侄非。R本人自食惡果不足惜蕉汪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逞怨。 院中可真熱鬧者疤,春花似錦、人聲如沸叠赦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽除秀。三九已至糯累,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間册踩,已是汗流浹背寇蚊。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棍好,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓允耿,卻偏偏與公主長得像借笙,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子较锡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355