Подтвердить что ты не робот

OkHttpClient выдает исключение после обновления до OkHttp3

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

private static OkHttpClient defaultHttpClient = new OkHttpClient();
static {
    defaultHttpClient.networkInterceptors().add(new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request().newBuilder()
                    .addHeader("Accept", "Application/JSON").build();
            return chain.proceed(request);
        }
    });
}

После обновления версии до версии бета-3 мне также пришлось обновить OkHttp до OkHttp3 (на самом деле я просто изменил имена пакетов с okhttp на okhttp3, библиотека включена в модификацию). После этого я получаю исключения из этой строки:

defaultHttpClient.networkInterceptors().add(new Interceptor());

Вызвано: java.lang.UnsupportedOperationException                                                                   в java.util.Collections $UnmodifiableCollection.add(Collections.java:932)


Вызвано: java.lang.ExceptionInInitializerError


В чем проблема?

4b9b3361

Ответ 1

Вам нужно использовать построитель, если вы хотите создать объект клиента OkHttp (3).

Попробуйте изменить это:

private static OkHttpClient defaultHttpClient = new OkHttpClient();

Что-то вроде этого:

  OkHttpClient defaultHttpClient = new OkHttpClient.Builder()
       .addInterceptor(
           new Interceptor() {
             @Override
             public Response intercept(Interceptor.Chain chain) throws IOException {
                   Request request = chain.request().newBuilder()
                   .addHeader("Accept", "Application/JSON").build();
               return chain.proceed(request);
              }
           }).build();

Ответ 2

compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile "com.squareup.retrofit2:converter-gson:2.1.0"
compile "com.squareup.retrofit2:adapter-rxjava:2.1.0"
compile 'com.squareup.okhttp3:logging-interceptor:3.4.0'

Вероятно, вы должны использовать эти версии. Просто поставьте их, синхронизируйте gradle, удалите все импорт и повторите попытку.

import okhttp3.Interceptor;

import okhttp3.OkHttpClient;

import okhttp3.Request;

import okhttp3.Response;

import okhttp3.logging.HttpLoggingInterceptor;

import retrofit2.Retrofit;

import retrofit2.converter.gson.GsonConverterFactory;

Ответ 3

Чтобы сложить ответ В.Ща, с помощью Java Lambda мы можем сократить это до

    OkHttpClient httpClient = new OkHttpClient.Builder()
        .addInterceptor(
                chain -> {
                    Request request = chain.request().newBuilder()
                            .addHeader("Accept", "Application/JSON").build();
                    return chain.proceed(request);
                }).build();