web-dev-qa-db-fra.com

OkHttpClient lève une exception après la mise à niveau vers OkHttp3

J'utilise les lignes de code suivantes pour ajouter un en-tête par défaut à toutes mes demandes envoyées à l'aide de 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);
        }
    });
}

Après la mise à niveau de retrofit vers la version beta-3, j'ai dû également mettre à niveau OkHttp vers OkHttp3 (en fait, je viens de changer le nom des packages okhttp en okhttp3, la bibliothèque est incluse dans retrofit). Après cela, je reçois des exceptions de cette ligne:

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

Causé par: Java.lang.UnsupportedOperationException at Java.util.Collections $ UnmodifiableCollection.add (Collections.Java:932)


Causé par: Java.lang.ExceptionInInitializerError


Quel est le problème ici?

30
Ashkan Sarlak

Vous devez utiliser le générateur si vous souhaitez créer un objet client OkHttp (3).

Essayez de changer ceci:

private static OkHttpClient defaultHttpClient = new OkHttpClient();

Pour quelque chose comme ça:

  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();
67
V.Sch
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'

Vous devriez probablement utiliser ces versions. Mettez-les simplement, synchronisez votre gradle, supprimez toutes les importations et réessayez.

import okhttp3.Interceptor;

import okhttp3.OkHttpClient;

import okhttp3.Request;

import okhttp3.Response;

import okhttp3.logging.HttpLoggingInterceptor;

import retrofit2.Retrofit;

import retrofit2.converter.gson.GsonConverterFactory;
1
Milan Misic

Pour additionner la réponse de V.Sch, avec Java Lambda nous pouvons raccourcir cela à

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