網(wǎng)絡(luò)請(qǐng)求:Retrofit2 + Rx2, 通過攔截器自動(dòng)添加請(qǐng)求參數(shù)

用到的依賴庫
    implementation 'com.squareup.retrofit2:retrofit:2.3.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'
    implementation 'io.reactivex.rxjava2:rxjava:2.1.7'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'

一個(gè)完整的網(wǎng)絡(luò)請(qǐng)求

public interface ApiURL {
    @GET("geocoding")
    Observable<ApiBean> getApiBean(@Query("a") String city); //@Query是向后追加的效果 等同于 geocoding?a=city
}
private void getDataByRx() {
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        //添加攔截器填硕,自動(dòng)追加參數(shù)
        builder.addInterceptor(new AppendUrlParamIntercepter());
        builder.addInterceptor(new AppendHeaderParamIntercepter());
        //添加攔截器籽腕,打印網(wǎng)絡(luò)請(qǐng)求
        if (NetworkConfig.DEBUG) {
            HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
            httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
            builder.addInterceptor(httpLoggingInterceptor);
        }
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://gc.ditu.aliyun.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .client(builder.build())
                .build();
        ApiURL apiURL = retrofit.create(ApiURL.class);
        Observable<ApiBean> api = apiURL.getApiBean("北京市");

        api.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<ApiBean>() {
                    @Override
                    public void accept(ApiBean apiBean) throws Exception {

                    }
                });
    }

統(tǒng)一追加Url

/**
 * Get請(qǐng)求自動(dòng)追加參數(shù)
 * Created by zkt on 2018-2-3.
 */

public class AppendUrlParamIntercepter implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        //偷天換日
        Request oldRequest = chain.request();

        //拿到擁有以前的request里的url的那些信息的builder
        HttpUrl.Builder builder = oldRequest
                .url()
                .newBuilder();

        //得到新的url(已經(jīng)追加好了參數(shù))
        HttpUrl newUrl = builder.addQueryParameter("deviceId", "12345")
                .addQueryParameter("token", "i_am_token")
                .addQueryParameter("appVersion", "1.0.0-beta")
                .build();

        //利用新的Url记焊,構(gòu)建新的request,并發(fā)送給服務(wù)器
        Request newRequest = oldRequest
                .newBuilder()
                .url(newUrl)
                .build();

        return chain.proceed(newRequest);
    }
}

統(tǒng)一追加Header

/**
 * 統(tǒng)一追加Header
 * Created by zkt on 2018-2-3.
 */

public class AppendHeaderParamIntercepter implements Interceptor {

    // 1.獲取以前的Builder
    // 2.為以前的Builder添加參數(shù)
    // 3.生成新的Builder

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

        Headers.Builder builder = request
                .headers()
                .newBuilder();

        //統(tǒng)一追加Header參數(shù)
        Headers newBuilder = builder.add("header1", "i am header 1")
                .add("token", "i am token")
                .build();

        Request newRequest = request.newBuilder()
                .headers(newBuilder)
                .build();

        return chain.proceed(newRequest);
    }
}

統(tǒng)一追加Body

/**
 * 將所有的Get -> POST, 將Get后面的Query Params -> Body (基本用不到)
 * Created by zkt on 2018-2-3.
 */

public class AppendBodyParamIntercepter implements Interceptor {

    // 1.獲取以前的Builder
    // 2.為以前的Builder添加參數(shù)
    // 3.生成新的Builder

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

        //拿到所有Query的Key
        Set<String> queryKeyName = request
                .url()
                .queryParameterNames();
        //將query -> body
        StringBuilder bodyString = new StringBuilder();
        for (String s : queryKeyName) {
            bodyString.append(s)
                    .append("=")
                    //查詢url后面key的value
                    .append(request.url().queryParameterValues(s))
                    .append(",");
        }
        //構(gòu)建新body。 MediaType根據(jù)實(shí)際情況更換
        RequestBody newBody = RequestBody.create(MediaType.parse("application/json"),
                bodyString.toString().substring(0, bodyString.toString().length() - 1));

        Request newRequest = request.newBuilder()
                .post(newBody)
                .build();

        return chain.proceed(newRequest);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子工腋,更是在濱河造成了極大的恐慌,老刑警劉巖畅卓,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件擅腰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡髓介,警方通過查閱死者的電腦和手機(jī)惕鼓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唐础,“玉大人箱歧,你說我怎么就攤上這事∫慌颍” “怎么了呀邢?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)豹绪。 經(jīng)常有香客問我价淌,道長(zhǎng),這世上最難降的妖魔是什么瞒津? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任蝉衣,我火速辦了婚禮,結(jié)果婚禮上巷蚪,老公的妹妹穿的比我還像新娘病毡。我一直安慰自己,他們只是感情好屁柏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布啦膜。 她就那樣靜靜地躺著,像睡著了一般淌喻。 火紅的嫁衣襯著肌膚如雪僧家。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天裸删,我揣著相機(jī)與錄音八拱,去河邊找鬼。 笑死涯塔,一個(gè)胖子當(dāng)著我的面吹牛乘粒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伤塌,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼灯萍,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了每聪?” 一聲冷哼從身側(cè)響起旦棉,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎药薯,沒想到半個(gè)月后绑洛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡童本,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年真屯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片穷娱。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绑蔫,死狀恐怖运沦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情配深,我是刑警寧澤携添,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站篓叶,受9級(jí)特大地震影響烈掠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缸托,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一左敌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧俐镐,春花似錦矫限、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至匹摇,卻和暖如春咬扇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背廊勃。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工懈贺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坡垫。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓梭灿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親冰悠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子堡妒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354