改用不带OkHttp的通用标头?

时间:2019-03-20 10:15:07

标签: android retrofit retrofit2 okhttp okhttp3

问题:

今天,我在OkHttp中遇到了一个例外。

  

由以下原因引起:java.lang.IllegalStateException:预期的Android API级别为21+,但是为19

我知道Okhttp不再支持<21版本的设备。

github page of Okhttp起,也从github issues起,来自okhttp版本3.13-

  

OkHttp可在Android 5.0+(API级别21+)和Java 8+上运行。

这是一个非常重大的变化,因为我所有的项目都在minSdkVersion = 16上运行。或至少19。

我尝试了什么?

  • 有一种方法可以按照Retrofit official page中的说明分别在每个请求中添加标头,但这将需要在每个请求中手动添加标头。
  • 我不想使用旧版本的Okhttp。因为这可能会导致我在okhttp新版本中修复的意外问题。 (还是我应该使用旧的?)

我需要什么:

我不希望仅使用Okhttp删除对约10%设备的支持(如果我将minSdkVersion增加到21+)。我使用Okhttp向所有Retrofit请求添加通用标头。

是否有一种无需使用Okhttp即可添加通用标头的方法?

1 个答案:

答案 0 :(得分:0)

您可以使用Interceptor来添加所需的所有标头:

OkHttpClient.Builder builder = new OkHttpClient.Builder();

        builder.addInterceptor(new Interceptor() {
            Request request;

            @Override
            public Response intercept(@NonNull Chain chain) throws IOException {

                request = chain.request().newBuilder().addHeader("Authorization", "Bearer " + GlobalClass.accessToken)
                        .addHeader("Accept", "application/json").build();

                return chain.proceed(request);
            }
        }).addNetworkInterceptor(httpLoggingInterceptor);

并返回此

 return builder.connectTimeout(15, TimeUnit.SECONDS)
                .writeTimeout(25, TimeUnit.SECONDS)
                .readTimeout(15, TimeUnit.SECONDS).build();