不支持的操作:Android,Retrofit,OkHttp。 在OkHttpClient中添加拦截器
我正在尝试通过Retrofit 2.0-beta3和Android中使用拦截器的OkHttpClient添加基于令牌的身份validation。 但是当我在OkHttpClient中添加拦截器时,我得到了UnsupportedOperationExceptionexception。 这里是我的代码:在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; }
我使用它就像:
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). */
我究竟做错了什么? 它可能是一个错误?
当您将Retrofit 2.0-beta2更改为Retrofit 2.0-beta3时,会发生此问题。 如果你想创buildOkHttpClient
对象,你必须使用builder。
更改:
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();
它应该解决你的问题。
如果其他答案不起作用,请尝试以下操作:
OkHttpClient okHttpClient = new OkHttpClient.Builder() .addInterceptor(new MyInterceptor()) .build(); retrofit = new Retrofit.Builder() .baseUrl("http://google.com") .addConverterFactory(GsonConverterFactory.create()) .client(okHttpClient) .build();