天天看點

網絡請求--Retrofit2使用方法

歡迎Follow我的GitHub, 關注我的CSDN.
網絡請求--Retrofit2使用方法

本文的合集已經編著成書,進階Android開發強化實戰,歡迎各位讀友的建議和指導。在京東即可購買:https://item.jd.com/12385680.html

網絡請求--Retrofit2使用方法

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

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

主要

(1) Retrofit2(beta3)的請求方式.

(2) Okhttp3的Interceptor.

(3) Okhttp3的Deserializer.

(4) Retrofit2使用Gson轉換器(Converter)和RxJava擴充卡(Adapter).

Github下載下傳位址

1. 基本請求

使用接口, 區分Get和Post方法.

/**
 * 網絡請求
 * <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類建立接口服務, 指定Gson為轉換器, 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();

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

    // 傳回人物資訊
    @Override
    public Observable<List<AvengersCharacter>> getCharacters(int currentOffset) {
        return mMarvelService.getCharacters(currentOffset);
    }
}
           

2. Interceptor

Interceptor是攔截器, 在發送之前, 添加一些參數, 或者擷取一些資訊.

如MarvelSigningInterceptor是添加參數, loggingInterceptor是列印參數.

/**
 * 添加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();

        // 添加新的參數
        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添加網絡參數.

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

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

3. Deserializer

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

public class MarvelResultsDeserializer<T> implements JsonDeserializer<List<T>> {
    @Override
    public List<T> deserialize(JsonElement je, Type typeOfT,
                               JsonDeserializationContext context) throws JsonParseException {
        // 轉換Json的資料, 擷取内部有用的資訊
        JsonElement results = je.getAsJsonObject().get("data")
                .getAsJsonObject().get("results");
        return new Gson().fromJson(results, typeOfT);
    }
}
           

Gson使用Deserializer, 過濾不用的參數.

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

4. 擷取資料

Rx選擇執行線程和傳回線程.

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

Rxjava+Dagger+Retrofit, 三個程式設計庫, 都已經寫完了, 基本都是在一起使用. 文章裡面都含有獨立Demo, 大家可以配合使用, 感謝Square給我們帶來, 的優雅代碼.

OK, that’s all! Enjoy it.