2016-01-08 3 views
47

Я пытаюсь добавить аутентификацию на токене через Retrofit 2.0-beta3 и OkHttpClient в Android с помощью перехватчиков. Но я получаю UnsupportedOperationException, когда добавляю свой перехватчик в OkHttpClient. Вот мой код: В ApiClient.javaНеподдерживаемая операция: Android, Дооснащение, OkHttp. Добавление перехватчика в 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; 
    } 

И я использую это нравится:

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

Но я получаю эту ошибку:

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) 

Это дает мне ошибку при добавлении новый перехватчик, заявляющий, что он не модифицируется. Коллекция, но документация для функции перехватчиков() говорит:/**

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

Что я делаю неправильно? Может быть, это ошибка?

+0

, какая версия OkHttp вы используете? – Blackbelt

+0

@ Усманхан Вы попробовали мое решение? –

+0

Извините, я не обновлял его раньше, но да, я изменил свой код на то, что вы предложили. И это сработало как шарм. –

ответ

124

Эта проблема возникает при изменении Дооснащаемого 2.0-beta2 к Retrofit 2.0-бета3. Вы должны использовать построитель, если хотите создать объект OkHttpClient.

Изменение:

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

к:

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

Это должно решить вашу проблему.

+0

они используют okhttp3 по умолчанию? – Blackbelt

+0

Вы имеете в виду Retrofit 2.0-beta3? Если да, то да. Насколько я знаю, в beta3 больше нет 'com.squareup.okhttp.OkHttpClient'. Вчера у меня была такая же проблема;) –

+0

, если нет 'OkHttpClient', как вы его создаете? – Blackbelt

-2

Попробуйте это, если другой ответ не работает:

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

 Смежные вопросы

  • Нет связанных вопросов^_^