gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:27:38 27 4
gpt4 key购买 nike

我想知道是否有办法让 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com