android - 为什么 okhttp3.Interceptor 不起作用?

标签 android dagger-2 okhttp

我在 OkHttpClient 中添加了两个 Inteceptor 和一个 NetworkInceptor,但只有 cachingInterceptor 起作用。我不知道如何添加另一个拦截器来修改我的请求 header 。

并且在代码下方有一张图片显示我的请求头没有被修改。

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

Here's my request headers

最佳答案

使用addInterceptor,而不是addNetworkInterceptor

您几乎总是需要应用程序拦截器,而不是网络拦截器。

网络拦截器仅在请求命中网络时调用,缓存命中时不调用。

关于android - 为什么 okhttp3.Interceptor 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41714226/

相关文章:

android - 如何在手机显示屏关闭时捕获按钮事件

Android:创建 AVD 的应用程序 Activity

android - 如何扩展 Android 按钮并使用 xml 布局文件

java - Dagger 2 多重绑定(bind)教程的@AutoAnnotation 不起作用。如何让它发挥作用?

android - Dagger 2 多进程依赖

android - 改造 2 : How to set individual timeouts on specific requests?

Android-Maven 安装时无法执行目标 org.codehaus.mojoto

android - 如果没有 @Inject 构造函数或来自 @Provides- 或 @Produces- 注释的方法,则不能提供改造

android - Lokhttp3/internal/Util 类中没有静态方法 delimiterOffset

android - 改造离线请求和响应