java - Dagger + retrofit 。在运行时添加身份验证 header

标签 java android retrofit2 dagger-2 dagger

我想知道是否有办法让 Dagger 知道它应该在新数据可用时重新创建一个对象。

我所说的实例是用于改造的请求 header 。在某些时候(当用户登录时),我得到一个 token ,我需要将其添加到改造的 header 中以发出经过身份验证的请求。问题是,我留下了相同的未经身份验证的 retrofit 版本。这是我的注入(inject)代码:

@Provides
    @Singleton
    OkHttpClient provideOkHttpClient(Cache cache) {
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(interceptor)
                .cache(cache).build();
         client
                .newBuilder()
                .addInterceptor(
                    chain -> {
                        Request original = chain.request();
                        Request.Builder requestBuilder = original.newBuilder()
                                .addHeader("Accept", "Application/JSON");
                        Request request = requestBuilder.build();
                        return chain.proceed(request);
                    }).build();
        return client;
    }

  @Provides
    @Singleton
    Retrofit provideRetrofit(Gson gson, OkHttpClient okHttpClient) { 
        Retrofit retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create(gson))
                .addCallAdapterFactory(RxErrorHandlingCallAdapterFactory.create())
                .baseUrl(mBaseUrl)
                .client(okHttpClient)
                .build();
        return retrofit;
}

@Provides
    @Singleton
    public NetworkService providesNetworkService(Retrofit retrofit) {
        return retrofit.create(NetworkService.class);
    }

关于如何完成这项工作的任何想法?

最佳答案

我亲自创建了一个 okhttp3.Interceptor 来为我做这件事,一旦我拥有所需的 token ,我就会更新它。它看起来像:

@Singleton
public class MyServiceInterceptor implements Interceptor {
  private String sessionToken;

  @Inject public MyServiceInterceptor() {
  }

  public void setSessionToken(String sessionToken) {
    this.sessionToken = sessionToken;
  }

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

    Request.Builder requestBuilder = request.newBuilder();

    if (request.header(NO_AUTH_HEADER_KEY) == null) {
      // needs credentials
      if (sessionToken == null) {
        throw new RuntimeException("Session token should be defined for auth apis");
      } else {
        requestBuilder.addHeader("Cookie", sessionToken);
      }
    }

    return chain.proceed(requestBuilder.build());
  }
}

在相应的dagger组件中,我暴露了这个拦截器,所以我可以在需要的时候设置sessionToken

这是 Jake 在他的演讲中谈到的一些内容 Making Retrofit Work For You .

关于java - Dagger + retrofit 。在运行时添加身份验证 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43051558/

相关文章:

android - 如果 Activity 刚刚停止,是否有办法将 Activity 移回前台?

android - 使用接口(interface)而不是类定义 Retrofit 返回类型

java - 如何从响应中检索数据? - 改造2

java - 为了与 .NET 平台一起工作,JAVA 有哪些缺点?

类型为 T 的 Java 参数化 JUnit

java - Python IO 错误 : too many open files

android - Volley jsonArray 请求不工作

android - 使用 Firebase 获取 "The test APK does not contain the test runner class specified by the user or the manifest file."

java - Android 设备和基于 Linux 的硬件之间的数据传输

android - 从 retrofit 响应中删除不需要的字符串