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
В чем проблема?
Ответы
Ответ 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();