2016-01-08 7 views
47

Ich versuche, Token-basierte Authentifizierung über Retrofit 2.0-Beta3 und OkHttpClient in Android mithilfe von Interzeptoren hinzuzufügen. Aber ich bekomme UnsupportedOperationException, wenn ich meinen Interceptor in OkHttpClient hinzufüge. Hier ist mein Code: In ApiClient.javaNicht unterstützte Operation: Android, Retrofit, OkHttp. Hinzufügen von Interceptor in OkHttpClient

public static TrequantApiInterface getClient(final String token) { 
     if(sTreqantApiInterface == null) { 

      Log.v(RETROFIT_LOG, "Creating api client for the first time"); 
      OkHttpClient okClient = new OkHttpClient(); 

      okClient.interceptors().add(new Interceptor() { 
       @Override 
       public Response intercept(Interceptor.Chain chain) throws IOException { 
        Request original = chain.request(); 

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

        Request request = requestBuilder.build(); 
        return chain.proceed(request); 
       } 
      }); 

      Retrofit client = new Retrofit.Builder() 
        .baseUrl(baseUrl) 
        .client(okClient) 
        .addConverterFactory(GsonConverterFactory.create()) 
        .build(); 
      sTreqantApiInterface = client.create(TrequantApiInterface.class); 
     } 
     return sTreqantApiInterface; 
    } 

Und ich mag es:

private void ampFreqTest(){ 
    String token = getSharedPreferences(getString(R.string.preference_file_key), Context.MODE_PRIVATE) 
         .getString(getString(R.string.key_token), ""); 

    service = ApiClient.getClient(token); 
    //I get an exception on this line: 
    Call<List<AmpFreq>> call = service.getUserAmpFreq("1"); 
    call.enqueue(new Callback<List<AmpFreq>>() { 
     @Override 
     public void onResponse(Response<List<AmpFreq>> response) { 
      Toast.makeText(HomeScreen.this, "Got result", Toast.LENGTH_LONG); 

      Log.v(ApiClient.RETROFIT_LOG, "Success api client." + response.message()); 
      Log.v(ApiClient.RETROFIT_LOG, "Success api client."); 
     } 
     @Override 
     public void onFailure(Throwable t) { 
      Toast.makeText(HomeScreen.this, t.getMessage() , Toast.LENGTH_LONG); 
      Log.v(ApiClient.RETROFIT_LOG, "Fail api client." + t.getMessage()); 
     } 
    }); 
} 

Aber ich bekomme diese Fehlermeldung:

Process: com.trequant.usman.trequant_android, PID: 14400 
java.lang.UnsupportedOperationException at java.util.Collections$UnmodifiableCollection.add(Collections.java:932) 
at com.trequant.usman.trequant_android.api.ApiClient.getClient(ApiClient.java:41) 

Es gibt mir Fehler auf Hinzufügen ein neuer Interceptor sagt, dass es keine modifizierbare Sammlung ist, aber die Dokumentation für die Funktion interceptors() sagt:/**

* Returns a modifiable list of interceptors that observe the full span of each call: from before 
    * the connection is established (if any) until after the response source is selected (either the 
    * origin server, cache, or both). 
    */ 

Was mache ich falsch? Könnte es ein Fehler sein?

+0

, welche Version von OkHttp verwenden Sie? – Blackbelt

+0

@Usmankhan Hast du meine Lösung versucht? –

+0

Entschuldigung, ich habe es vorher nicht aktualisiert, aber ja, ich hatte meinen Code auf das geändert, was Sie vorgeschlagen hatten. Und es hat wie ein Zauber funktioniert. –

Antwort

124

Dieses Problem tritt auf, wenn Sie Retrofit 2.0 Beta2 zu Retrofit 2.0-beta3 ändern. Sie müssen Builder verwenden, wenn Sie OkHttpClient Objekt erstellen möchten.

Wechsel:

OkHttpClient okClient = new OkHttpClient(); 

okClient.interceptors().add(new Interceptor() { 
     @Override 
     public Response intercept(Interceptor.Chain chain) throws IOException { 
      Request original = chain.request(); 

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

      Request request = requestBuilder.build(); 
      return chain.proceed(request); 
     } 
}); 

zu:

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

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

         Request request = requestBuilder.build(); 
         return chain.proceed(request); 
        } 
       }) 
      .build(); 

Es sollte Ihr Problem lösen.

+0

verwenden sie okhttp3 standardmäßig? – Blackbelt

+0

meinst du Retrofit 2.0-beta3? Wenn ja - die Antwort ist ja. Soweit ich weiß, gibt es in beta3 keinen 'com.squareup.okhttp.OkHttpClient' mehr. Ich hatte das gleiche Problem gestern;) –

+0

Wenn es keinen 'OkHttpClient' gibt, wie instanziiert man es? – Blackbelt

-2

Versuchen Sie dies, wenn die andere Antwort nicht funktioniert:

OkHttpClient okHttpClient = new OkHttpClient.Builder() 
    .addInterceptor(new MyInterceptor()) 
    .build(); 
retrofit = new Retrofit.Builder() 
    .baseUrl("http://google.com") 
    .addConverterFactory(GsonConverterFactory.create()) 
    .client(okHttpClient) 
    .build(); 
Verwandte Themen