如何通过分页库传递Retrofit标题和字段映射

问题描述 投票:0回答:2

所以,我正在研究 android 的新 分页库 。它具有不同的组件,您需要实现这些组件才能使其工作。假设我想使用一个 API 进行改造并通过分页更新无休止地滚动。考虑到您需要实现的所有内容(ViewModel、存储库、数据源等),将标头或字段映射传递到 Retrofit 的最佳方法是什么? https://github.com/googlesamples/android-architecture-components/tree/master/PagingWithNetworkSample

android pagination androidx android-architecture-components android-paging-library
2个回答
1
投票

Retrofit 与 PagingLibrary 无关,您将处理之前处理过的 Retrofit。 如果您想发送带有改造的 BasicAuth 标头,那么这里有一个代码。

package net.simplifiedcoding.retrofitandroidtutorial.api;

import android.util.Base64;

import java.io.IOException;

import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetrofitClient {

    private static final String AUTH = "Basic " + Base64.encodeToString(("belalkhan:123456").getBytes(), Base64.NO_WRAP);

    private static final String BASE_URL = "http://simplifiedlabs.xyz/MyApi/public/";
    private static RetrofitClient mInstance;
    private Retrofit retrofit;


    private RetrofitClient() {
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .addInterceptor(
                        new Interceptor() {
                            @Override
                            public Response intercept(Chain chain) throws IOException {
                                Request original = chain.request();

                                Request.Builder requestBuilder = original.newBuilder()
                                        .addHeader("Authorization", AUTH)
                                        .method(original.method(), original.body());

                                Request request = requestBuilder.build();
                                return chain.proceed(request);
                            }
                        }
                ).build();

        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(okHttpClient)
                .build();
    }

    public static synchronized RetrofitClient getInstance() {
        if (mInstance == null) {
            mInstance = new RetrofitClient();
        }
        return mInstance;
    }

    public Api getApi() {
        return retrofit.create(Api.class);
    }
}

上面的代码将为您将进行的每个改造调用添加相同的标头。

您将在 loadInitials()、loadBefore() 和 loadAfter() 等方法中使用相同的东西来获取所需的页面。

例如下面是我的Retrofit API接口。

public interface Api {

    @GET("answers")
    Call<StackApiResponse> getAnswers(@Query("page") int page, @Query("pagesize") int pagesize, @Query("site") String site);
}

这里我有一个调用方法,它采用页码、页面大小等参数来获取数据。

与在分页方法中调用它的方式相同。示例如下:

  //this will be called once to load the initial data
    @Override
    public void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull final LoadInitialCallback<Integer, Item> callback) {
        RetrofitClient.getInstance()
                .getApi().getAnswers(FIRST_PAGE, PAGE_SIZE, SITE_NAME)
                .enqueue(new Callback<StackApiResponse>() {
                    @Override
                    public void onResponse(Call<StackApiResponse> call, Response<StackApiResponse> response) {
                        if (response.body() != null) {
                            callback.onResult(response.body().items, null, FIRST_PAGE + 1);
                        }
                    }

                    @Override
                    public void onFailure(Call<StackApiResponse> call, Throwable t) {

                    }
                });
    }

我希望这有帮助。如果您想要逐步说明如何使用 Android 分页库和 PageKeyedDataSource,请按照此 Android 分页库教程

为了了解改造和构建 API,我在 youtube 上发布了完整的系列。您可以查看Retrofit Android 教程


0
投票

当您发布使用 Reddit API 的 PagingWithNetworkSample 时,在该示例中,您的 Retrofit 字段注释可能与此文件等效:

https://github.com/googlesamples/android-architecture-components/blob/master/PagingWithNetworkSample/app/src/main/java/com/android/example/paging/pagingwithnetwork/reddit/api/RedditApi.kt

您的改造标头也可能会进入该文件。

在 RedditApi 类中,从应用程序的其他部分调用 getTop 和 getTopAfter 等函数。 例如从这里 -

https://github.com/googlesamples/android-architecture-components/blob/d81da2cb1e3d61e40f052e631bb15883d0f9f637/PagingWithNetworkSample/app/src/main/java/com/android/example/paging/pagingwithnetwork/reddit/repository/inDb/SubredditBoundaryCallback。 kt#L54

因此,如果“将标头或字段映射到 Retrofit 的最佳方式”是指将标头和字段值传递给 Retrofit 的最佳方式,在本例中,它将来自 SubredditBoundaryCallback 中调用 getTop 和 getTopAfter 的函数(使用这些值可能从其他地方传递到 SubredditBoundaryCallback 中)。

© www.soinside.com 2019 - 2024. All rights reserved.