如何用匕首柄为网络模块添加改造基础认证



我是Kotlin的新手,我正在使用dagger柄来编写干净的代码。

我需要在除登录请求之外的所有请求中进行基本身份验证,因为令牌来自。登录请求。

我的问题是,除了登录之外,我如何使用dagger柄的基本身份验证来完成所有请求?

我的模块对象如下:

任何建议或样本代码请:(

@Module
@InstallIn(ApplicationComponent::class)
object NetworkingModule {
@Provides
fun providesBaseUrl(): String {
return NetworkingConstants.BASE_URL
}
@Provides
fun providesLoggingInterceptor(): HttpLoggingInterceptor {
return HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
}
@Provides
fun provideOkHttpClient(loggingInterceptor: HttpLoggingInterceptor): OkHttpClient {
val okHttpClient = OkHttpClient().newBuilder()
okHttpClient.callTimeout(40, TimeUnit.SECONDS)
okHttpClient.connectTimeout(40, TimeUnit.SECONDS)
okHttpClient.readTimeout(40, TimeUnit.SECONDS)
okHttpClient.writeTimeout(40, TimeUnit.SECONDS)
okHttpClient.addInterceptor(loggingInterceptor)
okHttpClient.build()
return okHttpClient.build()
}
@Provides
fun provideConverterFactory(): Converter.Factory {
return GsonConverterFactory.create()
}
@Provides
fun provideRetrofitClient(okHttpClient: OkHttpClient, baseUrl: String, converterFactory: Converter.Factory): Retrofit {
return Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.addConverterFactory(converterFactory)
.build()
}
@Provides
fun provideRestApiService(retrofit: Retrofit): ApiService {
return retrofit.create(ApiService::class.java)
}
}

我认为我应该使用BasicAuthInterceptor,但如何将其添加到hilt模块?

如果您需要为其他请求添加另一个拦截器,这意味着您需要提供相同类型的不同实现(多个绑定(

要告诉Hilt如何提供相同类型的不同实现(多个绑定(,可以使用限定符

限定符是用于标识绑定的注释。如果您需要通过实现Intercepor接口来添加另一个拦截器,您可以在Hilt模块内的函数上使用@Binds注释。但是您需要创建另一个模块来使用@Binds。

Hilt模块不能同时包含非静态绑定和抽象绑定方法,因此不能在同一类。

所以你的代码应该是这样的:

//第一:在NetworkingModule中为两种类型的OkHttpClient和两种不同的retrofitClients:定义四个限定符

@Module
@InstallIn(ApplicationComponent::class)
object NetworkingModule {
//FIRST: define four qualifiers in the NetworkingMoule
@Qualifier  // define qualifier for LoginRetrofitClient
@Retention(AnnotationRetention.BINARY)
annotation class LoginRetrofitClient

@Qualifier // define qualifier for OtherRetrofitClient
@Retention(AnnotationRetention.BINARY)
annotation class OtherRetrofitClient

@Qualifier  // define qualifier for LoginOkHttpClient
@Retention(AnnotationRetention.BINARY)
annotation class LoginOkHttpClient

@Qualifier // define qualifier for OtherOkHttpClient
@Retention(AnnotationRetention.BINARY)
annotation class OtherOkHttpClient


@Provides
fun providesBaseUrl(): String {
return NetworkingConstants.BASE_URL
}

// make sure add qualifier for LoginRetrofitClient
@LoggingInterceptor
@Provides
fun providesLoggingInterceptor(): HttpLoggingInterceptor {
return HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
}

// add @LoginOkHttpClient for providerOkHttpClient which we add AuthBasicInterceptorto to
@LoginOkHttpClient
@Provides
fun provideOkHttpClient(authBasicInterceptor: AuthBasicInterceptor): OkHttpClient {
val okHttpClient = OkHttpClient().newBuilder()

okHttpClient.callTimeout(40, TimeUnit.SECONDS)
okHttpClient.connectTimeout(40, TimeUnit.SECONDS)
okHttpClient.readTimeout(40, TimeUnit.SECONDS)
okHttpClient.writeTimeout(40, TimeUnit.SECONDS)
okHttpClient.addInterceptor(authBasicInterceptor)
okHttpClient.build()
return okHttpClient.build()
}

// add @OtherOkHttpClient for providerOkHttpClient which we add loggingInterceptor to
@OtherOkHttpClient
@Provides
fun provideOkHttpClient(loggingInterceptor: HttpLoggingInterceptor): OkHttpClient {
val okHttpClient = OkHttpClient().newBuilder()

okHttpClient.callTimeout(40, TimeUnit.SECONDS)
okHttpClient.connectTimeout(40, TimeUnit.SECONDS)
okHttpClient.readTimeout(40, TimeUnit.SECONDS)
okHttpClient.writeTimeout(40, TimeUnit.SECONDS)
okHttpClient.addInterceptor(loggingInterceptor)
okHttpClient.build()
return okHttpClient.build()
}

@Provides
fun provideConverterFactory(): Converter.Factory {
return GsonConverterFactory.create()
}

// make sure add qualifier for LoginRetrofitClient
@LoginRetrofitClient
@Provides
fun provideRetrofitClient(@LoginOkHttpClient okHttpClient: OkHttpClient,  // Remember to add @LoginOkHttpClient qualifier to distinguish OkHttpClient dependencies
baseUrl: String, converterFactory: Converter.Factory): Retrofit {
return Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.addConverterFactory(converterFactory)
.build()
}


@OtherRetrofitClient
@Provides
fun provideRetrofitClient(@OtherOkHttpClient okHttpClient: OkHttpClient, // Remember to add @OtherOkHttpClient qualifier to distinguish OkHttpClient dependencies
baseUrl: String,
converterFactory: Converter.Factory): Retrofit {
return Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.addConverterFactory(converterFactory)
.build()
}

// also you need different flavors of ApiService by defining two more qualifiers for different retrofitClients which I commented that for simplicity
// @Provides
//fun provideRestApiService(retrofit: Retrofit): ApiService {
// return retrofit.create(ApiService::class.java)
// }


}

现在我们需要添加AuthBasicInterceptor,我们需要创建一个名为AuthInterceptorModule.kt的新模块,并添加抽象bindAuthInterceptor函数,类型为Interceptor。

AuthInterceptor模块.kt


@InstallIn(ApplicationComponent::class)
@Module
abstract class AuthInterceptorModule {

@Binds
abstract fun bindAuthInterceptor(basicAuthInterceptor: AuthBasicInterceptor): Interceptor
}

并创建另一个名为AuthBasicInterceptor的类。kt实现Interceptor:

class AuthBasicInterceptor @Inject constructor() : Interceptor {
...
}

就是这样,一切都安排好了。现在您可以将retrofitClients注入其他类,如:

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@LoginRetrofitClient
@Inject lateinit var loginRetrofit: Retrofit
@OtherRetrofitClient
@Inject lateinit var otherRetrofit: Retrofit
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
...
}
...
}

最新更新