網(wǎng)絡(luò)服務(wù)庫Retrofit2的使用方式

歡迎Follow我的GitHub, 關(guān)注我的簡書. 其余參考Android目錄.

Retrofit

本文的合集已經(jīng)編著成書月弛,高級Android開發(fā)強化實戰(zhàn)列林,歡迎各位讀友的建議和指導(dǎo)惋嚎。在京東即可購買:https://item.jd.com/12385680.html

Android

Retrofit是Square開發(fā)的網(wǎng)絡(luò)請求庫, 簡化了網(wǎng)絡(luò)請求的使用, 這個庫太知名了, 好處我就不多說了. 讓我們看看如何使用吧?

注意: Retrofit2的beta3版本, 使用Okhttp3, Interceptor使用方式發(fā)生改變.

主要
(1) Retrofit2(beta3)的請求方式.
(2) Okhttp3的Interceptor.
(3) Okhttp3的Deserializer.
(4) Retrofit2使用Gson轉(zhuǎn)換器(Converter)RxJava適配器(Adapter).


1. 基本請求

使用接口, 區(qū)分GetPost方法.

/**
 * 網(wǎng)絡(luò)請求
 * <p>
 * Created by wangchenlong on 16/1/21.
 */
public interface MarvelService {
    String END_POINT = "http://gateway.marvel.com/";
    String PARAM_API_KEY = "apikey";
    String PARAM_HASH = "hash";
    String PARAM_TIMESTAMP = "ts";

    @GET("/v1/public/characters")
    Observable<List<AvengersCharacter>> getCharacters(@Query("offset") int offset);
}

使用Retrofit類創(chuàng)建接口服務(wù), 指定Gson為轉(zhuǎn)換器, RxJava為適配器.

public class RestDataSource implements Repository {

    private final MarvelService mMarvelService;

    @Inject
    public RestDataSource() {
        // Log信息
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);

        // 公私密匙
        MarvelSigningInterceptor signingInterceptor = new MarvelSigningInterceptor(
                BuildConfig.MARVEL_PUBLIC_KEY, BuildConfig.MARVEL_PRIVATE_KEY);

        // OkHttp3.0的使用方式
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(signingInterceptor)
                .addInterceptor(loggingInterceptor)
                .build();

        // 選擇人物信息
        Gson customGsonInstance = new GsonBuilder()
                .registerTypeAdapter(new TypeToken<List<AvengersCharacter>>() {
                        }.getType(),
                        new MarvelResultsDeserializer<AvengersCharacter>())
                .create();

        // 適配器
        Retrofit marvelApiAdapter = new Retrofit.Builder()
                .baseUrl(MarvelService.END_POINT)
                .addConverterFactory(GsonConverterFactory.create(customGsonInstance))
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .client(client)
                .build();

        // 服務(wù)
        mMarvelService = marvelApiAdapter.create(MarvelService.class);
    }

    // 返回人物信息
    @Override
    public Observable<List<AvengersCharacter>> getCharacters(int currentOffset) {
        return mMarvelService.getCharacters(currentOffset);
    }
}

2. Interceptor

Interceptor是攔截器, 在發(fā)送之前, 添加一些參數(shù), 或者獲取一些信息.
如MarvelSigningInterceptor是添加參數(shù), loggingInterceptor是打印參數(shù).

/**
 * 添加Key和密碼
 * <p>
 * Created by wangchenlong on 16/1/21.
 */
public class MarvelSigningInterceptor implements Interceptor {
    private final String mApiKey;
    private final String mApiSecret;

    public MarvelSigningInterceptor(String apiKey, String apiSecret) {
        mApiKey = apiKey;
        mApiSecret = apiSecret;
    }

    @Override public Response intercept(Interceptor.Chain chain) throws IOException {
        String marvelHash = MarvelApiUtils.generateMarvelHash(mApiKey, mApiSecret);
        Request oldRequest = chain.request();

        // 添加新的參數(shù)
        HttpUrl.Builder authorizedUrlBuilder = oldRequest.url()
                .newBuilder()
                .scheme(oldRequest.url().scheme())
                .host(oldRequest.url().host())
                .addQueryParameter(MarvelService.PARAM_API_KEY, mApiKey)
                .addQueryParameter(MarvelService.PARAM_TIMESTAMP, MarvelApiUtils.getUnixTimeStamp())
                .addQueryParameter(MarvelService.PARAM_HASH, marvelHash);

        // 新的請求
        Request newRequest = oldRequest.newBuilder()
                .method(oldRequest.method(), oldRequest.body())
                .url(authorizedUrlBuilder.build())
                .build();

        return chain.proceed(newRequest);
    }
}

addQueryParameter添加網(wǎng)絡(luò)參數(shù).

Okhttp3使用了裝飾者模式, 使用Builder添加Interceptor.

        // OkHttp3.0的使用方式
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(signingInterceptor)
                .addInterceptor(loggingInterceptor)
                .build();

3. Deserializer

Deserializer是反序列化, Gson使用, 去除不使用的參數(shù).

public class MarvelResultsDeserializer<T> implements JsonDeserializer<List<T>> {
    @Override
    public List<T> deserialize(JsonElement je, Type typeOfT,
                               JsonDeserializationContext context) throws JsonParseException {
        // 轉(zhuǎn)換Json的數(shù)據(jù), 獲取內(nèi)部有用的信息
        JsonElement results = je.getAsJsonObject().get("data")
                .getAsJsonObject().get("results");
        return new Gson().fromJson(results, typeOfT);
    }
}

Gson使用Deserializer, 過濾不用的參數(shù).

        // 選擇人物信息
        Gson customGsonInstance = new GsonBuilder()
                .registerTypeAdapter(new TypeToken<List<AvengersCharacter>>() {
                        }.getType(),
                        new MarvelResultsDeserializer<AvengersCharacter>())
                .create();

4. 獲取數(shù)據(jù)

Rx選擇執(zhí)行線程和返回線程.

    private void loadData() {
        mCharactersSubscription = mRepository.getCharacters(0)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(avengersCharacters -> {
                    mMainView.setListData(avengersCharacters);
                });
    }

Rxjava+Dagger+Retrofit, 三個編程庫, 都已經(jīng)寫完了, 基本都是在一起使用. 文章里面都含有獨立Demo, 大家可以配合使用, 感謝Square給我們帶來, 的優(yōu)雅代碼.

OK, that's all! Enjoy it.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末输虱,一起剝皮案震驚了整個濱河市予权,隨后出現(xiàn)的幾起案子昂勉,更是在濱河造成了極大的恐慌,老刑警劉巖扫腺,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岗照,死亡現(xiàn)場離奇詭異,居然都是意外死亡笆环,警方通過查閱死者的電腦和手機攒至,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躁劣,“玉大人迫吐,你說我怎么就攤上這事≌送” “怎么了渠抹?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長闪萄。 經(jīng)常有香客問我梧却,道長,這世上最難降的妖魔是什么败去? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任放航,我火速辦了婚禮,結(jié)果婚禮上圆裕,老公的妹妹穿的比我還像新娘广鳍。我一直安慰自己,他們只是感情好吓妆,可當(dāng)我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布赊时。 她就那樣靜靜地躺著,像睡著了一般行拢。 火紅的嫁衣襯著肌膚如雪祖秒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天,我揣著相機與錄音竭缝,去河邊找鬼房维。 笑死,一個胖子當(dāng)著我的面吹牛抬纸,可吹牛的內(nèi)容都是我干的咙俩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼湿故,長吁一口氣:“原來是場噩夢啊……” “哼阿趁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坛猪,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤脖阵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后砚哆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡屑墨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年躁锁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卵史。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡战转,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出以躯,到底是詐尸還是另有隱情槐秧,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布忧设,位于F島的核電站刁标,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏址晕。R本人自食惡果不足惜膀懈,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谨垃。 院中可真熱鬧启搂,春花似錦、人聲如沸刘陶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匙隔。三九已至疑苫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缀匕。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工纳决, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乡小。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓阔加,卻偏偏與公主長得像,于是被迫代替她去往敵國和親满钟。 傳聞我的和親對象是個殘疾皇子胜榔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容