Как кешировать в Android с помощью модернизации с аутентификацией Oauth1.0 - PullRequest
0 голосов
/ 25 июня 2019

Я использую модификацию для отправки запроса в Woocommerce и получения данных с сервера, и мне нужно кэшировать данные.

Я использовал инструменты для модернизации, предоставленные библиотекой для кэширования данных.Это не сработало.Я искал в Интернете и протестировал множество решений. У меня есть успешный результат, но он все еще не работает.

Мой код:

API:

@GET(URLs.EndPoint_Products)
Call<List<Salons>> getProductsCategorized(

        @Query("category") String category,
        @Query("per_page") int per_page
);

ЗапросМетод:

 private void okhttpReq(int categoryId) {

    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

    OAuthInterceptor oauth1Woocommerce = new OAuthInterceptor.Builder()
            .consumerKey(getString(R.string.cunsomer_key))
            .consumerSecret(getString(R.string.consumersecret))
            .build();

    OkHttpClient client = new OkHttpClient
            .Builder()
            .cache(new Cache(getContext().getCacheDir(), 10 * 1024 * 1024)) // 10 MB
            .addInterceptor(oauth1Woocommerce)
            .addInterceptor(interceptor)
            .addInterceptor(new Interceptor() {
                @Override
                public okhttp3.Response intercept(Chain chain) throws IOException {
                    Request request = chain.request();

                    if (isOnline()) {
                        request = request.newBuilder().header("Cache-Control", "public, max-age=" + 88888860).build();
                    } else {
                        request = request.newBuilder().header("Cache-Control", "public, only-if-cached, max-stale=" + 60 * 60 * 24 * 7).build();
                    }
 //                        request = request.newBuilder().header("Cache-Control", "public, max-age=" + 60).build();

                    return chain.proceed(request);
                }
            })
            .build();

    Gson gson = new GsonBuilder()
            .setLenient()
            .create();

    Retrofit mRetrofit = new Retrofit.Builder()
            .baseUrl(baseURL)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .client(client)
            .build();

    Api api = mRetrofit.create(Api.class);

Call    callSalons = api.getProductsCategorized(String.valueOf(categoryId), 100);

    callSalons.enqueue(new Callback<List<Salons>>() {
        @Override
        public void onResponse(Call<List<Salons>> call, Response<List<Salons>> response) {
            if (response.raw().cacheResponse() != null) {
                Log.e("Network", "response came from cache");

            }

            if (response.raw().networkResponse() != null) {
                Log.e("Network", "response came from server");
            }
            salonList.clear();
            Log.e("response1", response.headers().toString());

            if (response.isSuccessful()) {
                try {

                    assert response.body() != null;
                    for (int i = 0; i < response.body().size(); i++) {
                        Salons array = response.body().get(i);

                        //adding the product to product list
                        try {
                            salonList.add(new Salon(
                                    array.getId(),
                                    array.getName(),
                                    descriptionCorrector(array.getShort_description()),
                                    array.getAverage_rating(),
                                    Double.valueOf(array.getPrice()),
                                    array.getCategories(),
                                    array.getAttributes(),
                                    array.getImages()
                            ));

                        } catch (Exception e) {
 //                            Log.d("retrofit error", e.getMessage());


                        }
                    }
                    productAdapter();

                } catch (Exception e) {
                    Log.d("sizeerror", e.getMessage());

                }

                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                }
                if (isStart) {
                    isStart = false;
                    okhttpReq_category();
                }
            } else {

                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                }
                okhttpReq_category();

            }
        }

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

            if (progressDialog.isShowing()) {
                progressDialog.dismiss();
            }
        }
    });

}

Этот запрос выполнен успешно, но он всегда возвращает ответ от сервера, а не из кэша.

Я проверил много ответов на Stackoverflow, но ни один из них не работает для меня,единственное различие между моим делом и другими подобными проблемами заключается в следующем:

            .addInterceptor(oauth1Woocommerce)

, который предназначен для аутентификации Woocommerce.

Я проверил несколько раз, но он должен быть в сети, чтобы иметь успешный запрос и всегда получать данные с сервера, а не из кэша.

Не могли бы вы мне помочь?

Заранее спасибо

...