Android網絡請求--Retrofit2使用方法

KandiGolder 8年前發布 | 90K 次閱讀 Retrofit Gson Android開發 移動開發

歡迎Follow我的 GitHub , 關注我的CSDN.

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

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

主要

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

(2) Okhttp3的Interceptor.

(3) Okhttp3的Deserializer.

(4) Retrofit2使用 Gson轉換器(Converter)RxJava適配器(Adapter) .

Github 下載地址

1. 基本請求

使用接口, 區分 GetPost 方法.

/*  網絡請求  <p>  Created by wangchenlong on 16/1/21. */
public interface MarvelService {
    String END_POINT = "

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

}</pre>

使用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);
}

}</pre>

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);
}

}</pre>

addQueryParameter添加網絡參數.

</div>

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

        // OkHttp3.0的使用方式
        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(0)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(avengersCharacters -> {
                    mMainView.setListData(avengersCharacters);
                });
    }

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

OK, that’s all! Enjoy it.

來自: http://blog.csdn.net/caroline_wendy/article/details/50557470

 本文由用戶 KandiGolder 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!