2016-11-24 143 views
1

尝试添加一个拦截器来添加标头到okhttp3和retrofit2的请求。我注意到头文件没有被添加到请求中,我的system.out.println调试行从未被调用。不知道为什么,但这里是我的代码:拦截器没有被调用retrofit2

创建服务:

OkHttpClient client = new OkHttpClient(); 

     client.newBuilder() 
       .addInterceptor(new ServiceInterceptor(context)) 
       .authenticator(new MyAuthenticator(context)) 
       .build(); 

     service = (new Retrofit.Builder() 
       .baseUrl(BASE_URL) 
       .client(client) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build()) 
       .create(Service.class); 

ServiceInterceptor:

public class ServiceInterceptor implements Interceptor { 

    private final Context context; 

    public ServiceInterceptor(Context context){ 
     this.context = context; 
    } 

    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Request request = chain.request(); 

     System.out.println("Interceptor"); 

     if(request.header("No-Authentication") == null){ 
      request = request.newBuilder() 
        .addHeader("User-Agent", "APP NAME") 
        .addHeader("Authorization", "bearer " + PreferenceManager.getDefaultSharedPreferences(context).getString("access_token", "")) 
        .build(); 
     } 

     return chain.proceed(request); 
    } 
} 

的问题不完全是一部分,但我的认证是从来没有被称为要么...:

public class MyAuthenticator implements Authenticator { 
    private Context context; 

    public MyAuthenticator(Context context){ 
     this.context = context; 
    } 

    @Override 
    public Request authenticate(Route route, Response response) throws IOException { 
     //blah blah refresh token here... 

     return null; 
    } 
} 

回答

3

您将client设置为默认OkHttpClient。您可以使用newBuilder()从该客户端创建一个新客户端,但不要将其分配给任何内容。如果你不使用第一个客户端,你应该只是第一次分配一个构建器 -

OkHttpClient client = new OkHttpClient.Builder() 
      .addInterceptor(new ServiceInterceptor(context)) 
      .authenticator(new MyAuthenticator(context)) 
      .build(); 
+0

我有同样的问题。我没有把它分配给一个新的变量,所以所有的配置设置都丢失了。但是现在我已经将它分配给了一个变量了。 – toobsco42