使用拦截器添加标头的Android Retrofit 2.0不起作用

时间:2017-09-22 11:54:48

标签: android retrofit2 interceptor okhttp3

我为Singleton客户端设置了OkHttp dagger模块,我正在尝试使用Interceptor添加标头

@Provides
@Singleton
OkHttpClient provideOkhttpClient(Cache cache, final LocalData localData) {
    HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
    logging.setLevel(HttpLoggingInterceptor.Level.HEADERS);

    OkHttpClient.Builder client = new OkHttpClient.Builder();
    client.readTimeout(60, TimeUnit.SECONDS);
    client.addInterceptor(logging);
    client.addNetworkInterceptor(new Interceptor() {
        @Override
        public Response intercept(@NonNull Chain chain) throws IOException {
            Request original = chain.request();
            Request.Builder requestBuilder = original.newBuilder()
                    .addHeader("Hp-Application", "Android");
            Request request = requestBuilder.build();
            Response originalResponse = chain.proceed(request);
            try {
                if (originalResponse.code() == 200) {
                    localData.setLastUpdateTime(System.currentTimeMillis());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return originalResponse;
        }
    });
    client.connectTimeout(60, TimeUnit.SECONDS);
    client.cache(cache);
    return client.build();
}

但是查看日志我看不到预期的标题。此外,我收到错误,因为没有必要的标题,特定的调用不起作用。

我还尝试使用不同的类

将其添加到addInterceptor()/addNetworkInterceptor()
 public class HeaderInterceptor
        implements Interceptor {
    @Override
    public Response intercept(Chain chain)
            throws IOException {
        Request request = chain.request();
        request = request.newBuilder()
                .addHeader("Hp-Application", "Android")
                .build();
        return chain.proceed(request);
    }
}

但这种方式对我也不起作用。

如何将此标题添加到只有一个实现的每次应用程序调用?

3 个答案:

答案 0 :(得分:8)

添加拦截器的顺序很重要。您的日志记录拦截器首先运行,然后才会运行标头添加拦截器。

为获得最佳日志记录体验,请将日志记录拦截器设置为您添加的最后一个。

答案 1 :(得分:2)

嘿@Igor尝试这个可能有帮助的片段

public class RetrofitClient {

    private static String BASE_URL = "http://192.168.0.100/rest/main.php/";
    private static Retrofit retrofit = null;

    public static Retrofit getRetroftInstance() {
        if (retrofit == null) {

            OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
            httpClient.addNetworkInterceptor(new SessionRequestInterceptor());
            httpClient.addNetworkInterceptor(new ReceivedCookiesInterceptor());

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

        return retrofit;
    }}

public class ReceivedCookiesInterceptor implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {
        Response originalResponse = chain.proceed(chain.request());

        if (!originalResponse.headers("Set-Cookie").isEmpty()) {
            HashSet<String> cookies = new HashSet<>();
            for (String header : originalResponse.headers("Set-Cookie")) {
                cookies.add(header);
                if(header.startsWith("XSRF-TOKEN")) {
                    String newCookie[]=header.split(";");
                    System.out.println("newCookie Length: "+newCookie.length);
                    for(String ss:newCookie) {
                        if(ss.startsWith("XSRF-TOKEN")) {
                            System.out.println("Cookies ss: " + ss);
                            sharedPrefs.setToken(ss);
                        }
                    }
                }
            }
        }
        return originalResponse;
    }
}

public class SessionRequestInterceptor implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request original = chain.request();

        Request.Builder request = original.newBuilder();

        request.header("Cookie",ServiceSharedPrefs.getInstance().getToken()));

        request.method(original.method(), original.body());

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

}

答案 2 :(得分:0)

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



                            // Request customization: add request headers
                            Request.Builder requestBuilder = original.newBuilder().
                                    header(AUTHENTICATION_HEADER, AUTHENTICATION_KEY).
                                    method(original.method(), original.body());


                            Request request = requestBuilder.build();

                            //System.out.println(request.toString());

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