Почему не работает okhttp3.Interceptor?

Я добавляю два Inteceptor и NetworkInceptor в OkHttpClient, но работает только cachingInterceptor. Я не знаю, как добавить еще один перехватчик, чтобы изменить заголовки моих запросов.

И есть изображение, показывающее, что заголовки моих запросов не были изменены ниже кода.

import android.app.Application;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.orhanobut.logger.Logger;

import java.io.IOException;

import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;
import me.strugglingvincent.meizhichinese.NetworkApi;
import me.strugglingvincent.meizhichinese.Util.ConnectionUtil;
import okhttp3.Cache;
import okhttp3.Headers;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory; 
import rx.Scheduler;
import rx.schedulers.Schedulers;

/**
 * NetModule Object
 * Created by StrugglingVincent on 12/08/2016.
 */
@Module
public class NetModule {

private final String mBaseUrl;

public NetModule() {
    mBaseUrl = "https://wtf.herokuapp.com/wtf/";
}

@Provides
@Singleton
NetworkApi provideNetworkApi(Retrofit retrofit) {
    return retrofit.create(NetworkApi.class);
}


@Provides
@Singleton
OkHttpClient provideOkHttpClient(Cache cache, Interceptor cachingInterceptor) {
    OkHttpClient.Builder builder = new OkHttpClient.Builder();
    builder.addInterceptor(cachingInterceptor);             //It works
    builder.addInterceptor(new Interceptor() {              //It doesn't work
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request()
                    .newBuilder()
                    .addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
                    .addHeader("Accept-Encoding", "gzip, deflate")
                    .addHeader("Connection", "keep-alive")
                    .addHeader("Accept", "*/*")
                    .addHeader("Cookie", "add cookies here")
                    .addHeader("Referer","http://www.baidu.com")
                    .build();
            System.out.println("interceptor:"+request.headers());
            return chain.proceed(request);
        }
    });
    builder.addNetworkInterceptor(new Interceptor() {       //It doesn't work
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request()
                    .newBuilder()
                    .addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
                    .addHeader("Accept-Encoding", "gzip, deflate")
                    .addHeader("Connection", "keep-alive")
                    .addHeader("Accept", "*/*")
                    .addHeader("Cookie", "add cookies here")
                    .addHeader("Referer","http://www.baidu.com")
                    .build();
            System.out.println("network:"+request.headers());
            return chain.proceed(request);
        }
    });
    builder.cache(cache);
    return builder.build();
}

@Provides
@Singleton
Cache provideCache(Application application) {
    int cacheSize = 10 * 1024 * 1024;//10 mb
    return new Cache(application.getCacheDir(), cacheSize);
}

@Provides
@Singleton
    Retrofit provideRetrofit(OkHttpClient okHttpClient, GsonConverterFactory gsonConverterFactory) {
    System.out.println("shenmjibawanyier?"+okHttpClient!=null);
    System.out.println("fdsja;lfsjkl;"+okHttpClient.interceptors());
    System.out.println("wfewajfewafewea"+okHttpClient.networkInterceptors());
    Retrofit.Builder retrofitBuilder = new Retrofit.Builder();
    retrofitBuilder.baseUrl(mBaseUrl)
            .client(okHttpClient)
            .addConverterFactory(gsonConverterFactory)
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create());
    return retrofitBuilder.build();
}

@Provides
@Singleton
GsonConverterFactory provideGsonFactory() {
    Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").create();
    return GsonConverterFactory.create(gson);
}

/**
 * Log Network Response
 *
 * @return Logging Interceptor
 */
@Provides
@Singleton
HttpLoggingInterceptor getHttpLoggingInterceptor() {
    HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
        @Override
        public void log(String message) {
            Logger.t(5).i(message);
        }
    });
    httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    return httpLoggingInterceptor;
}

/**
 * Cache Are available when Network Connection is not available
 *
 * @return Caching Interceptor
 */
@Provides
@Singleton
Interceptor getCachingInterceptor(final Application mApp) {
    return new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            if (ConnectionUtil.isNetworkAvailable(mApp)) {
                request = request.newBuilder().header("Cache-Control", "public, max-age=" + 60).build();
            } else {
                request = request.newBuilder().header("Cache-Control", "public, only-if-cached, max-stale=" + 60 * 60 * 24 * 7).build();
            }
            return chain.proceed(request);
        }
    };
}


@Provides
@Singleton
Scheduler provideScheduler() {
    return Schedulers.io();
}

}

Вот заголовки моего запроса


person user7434432    schedule 18.01.2017    source источник
comment
Вы получаете ответ после Call.execute()? Единственное, о чем я могу думать, это о том, что ваш cachingInterceptor выдает исключение IOException, чтобы вырваться.   -  person Eric Cochran    schedule 18.01.2017
comment
Спасибо за ваш ответ, но я не получил IOException. Я изменил свой вопрос. Не могли бы вы еще раз проверить код, пожалуйста?   -  person user7434432    schedule 19.01.2017
comment
Это потому, что вы использовали addNetworkInterceptor вместо addInterceptor   -  person EpicPandaForce    schedule 19.01.2017


Ответы (1)


Используйте addInterceptor, а не addNetworkInterceptor.

Вам почти всегда нужен перехватчик приложений, а не сетевой перехватчик.

Сетевые перехватчики вызываются только тогда, когда запрос попадает в сеть, а не при попадании в кэш.

person kai    schedule 19.01.2017