Unsupported operation: Android, retrofit, OkHttp. Adding an interceptor to OkHttpClient

I am trying to add authentication on tokens through Retrofit 2.0-beta3 and OkHttpClient in Android using interceptors. But I get an UnsupportedOperationException when I add my interceptor to OkHttpClient. Here is my code: In ApiClient.java

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; } 

And I use it like:

 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() ); } }); } 

But I get this error:

 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) 

This gives me an error when adding a new interceptor saying that it does not change the Collection, but the documentation for the interceptor () function says: / **

  * 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). */ 

What am I doing wrong? Maybe this is a mistake?

+45
java android retrofit retrofit2
Jan 08 '16 at 10:31 on
source share
2 answers

This issue occurs when Retrofit 2.0-beta2 changes to Retrofit 2.0-beta3 . You must use the builder if you want to create an OkHttpClient object.

Edit:

  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); } }); 

to:

  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(); 

It should solve your problem.

+123
Jan 08 '16 at 13:36
source

Try if another answer doesn't work:

 OkHttpClient okHttpClient = new OkHttpClient.Builder() .addInterceptor(new MyInterceptor()) .build(); retrofit = new Retrofit.Builder() .baseUrl("http://google.com") .addConverterFactory(GsonConverterFactory.create()) .client(okHttpClient) .build(); 
-2
Oct 21 '16 at 14:23
source



All Articles