Dagger + Retrofit,在运行时添加身份验证标头?

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

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

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

}

关于如何使这项工作有任何想法吗?

原文由 AIntel 发布,翻译遵循 CC BY-SA 4.0 许可协议


回答:

请考虑使用 @oldergod 提到 的方法,因为它是 “官方” 且更好的方法, 而不 建议使用下面提到的方法,它们可能被视为解决方法。


你有几个选择。

  1. 获得令牌后,您必须清空为您提供 Retrofit 实例的组件,创建一个新组件并请求一个新的 Retrofit 实例,该实例将被实例化具有必要的 okhttp 实例。
  2. 一个快速而糟糕的 - 将令牌保存在 SharedPreferences 中,创建 okHttp 标头,这将应用从 SharedPreferences 读取的令牌。如果没有 - 不发送令牌标头。
  3. 更丑陋的解决方案 - 声明一个 static volatile String 字段,然后执行与步骤 2 中相同的操作。

为什么第二种选择不好?因为在每次请求时,您都会轮询磁盘并从那里获取数据。

原文由 azizbekian 发布,翻译遵循 CC BY-SA 4.0 许可协议


回答:

我亲自创建了一个 okhttp3.Interceptor 为我做的,我在获得所需令牌后更新它。它看起来像:

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

}

}

在相应的匕首组件中,我公开了这个拦截器,因此我可以在需要时设置 sessionToken

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

原文由 oldergod 发布,翻译遵循 CC BY-SA 3.0 许可协议

以上是 Dagger + Retrofit,在运行时添加身份验证标头? 的全部内容, 来源链接: utcz.com/p/944861.html

回到顶部