【问题标题】:How to add MyServiceInterceptor class to networkmodule using dagger hilt android?如何使用 dagger hilt android 将 MyServiceInterceptor 类添加到 networkmodule?
【发布时间】:2020-12-20 19:16:02
【问题描述】:

我需要将 MyServiceInterceptor 类添加到我的刀柄服务模块中以获取不同的请求。 例如我的登录请求不需要标头授权,但我的其他请求需要不记名令牌。

我的问题是如何添加这个?有什么帮助吗?

我的网络模块

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

还有 MyServiceInterceptorClass

@Singleton
public class MyServiceInterceptor @Inject constructor(
    private val preferencesHelper: PreferencesHelper
) : Interceptor {

    @Throws(IOException::class)
    override fun intercept(chain: Interceptor.Chain): Response {
        var newRequest: Request = chain.request()

        newRequest = newRequest.newBuilder()
            .addHeader(
                "AccessToken",
                preferencesHelper.getAccessTokenFromPreference()!!
            )
            .build()

        return chain.proceed(newRequest)

    }
}

【问题讨论】:

  • 在使用 Hilt 或 Dagger 之前有不同的方法可以做到这一点。你遵循哪种方法?所以我可以考虑如何让刀柄在这方面帮助你(如果需要的话)。
  • 我从登录请求中获取令牌。其他所有请求都将使用此令牌。(不记名令牌)
  • 不不,我的意思是,如果你根本不使用依赖注入......你将使用哪种方式来解决这个问题。我在 stackoverflow 的某个地方读到了不需要 Hilt 的解决方案。或者你在问如何使用 Retrofit 来解决它?
  • 能否提供需要处理的两个请求对象的示例。同时,您可以在 dagger 中查看 Qualifiers。
  • 你找到解决办法了吗?

标签: android kotlin retrofit dagger-hilt


【解决方案1】:

您可以使用限定符在您的网络模块中添加您的服务拦截器类。这是一个工作示例。

首先,创建一个类 qualifiers.kt 并在其中为您的服务类定义注释

@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class ApiKeyInterceptorOkHttpClient

您可以为 Interceptor 创建单独的类,如下所示:

class ApiKeyInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val original: Request = chain.request()
        val httpUrl: HttpUrl = original.url
        val url: HttpUrl = httpUrl.newBuilder()
            .addQueryParameter("api_key", BuildConfig.API_KEY)
            .build()
        val request: Request = original.newBuilder().url(url).build()
        return chain.proceed(request)
    }
}

然后,在您的网络模块中,您可以提供您的拦截器

@ApiKeyInterceptorOkHttpClient
@Singleton
@Provides
fun providesApiKeyInterceptor(): Interceptor = ApiKeyInterceptor()

最后你可以在你的 Okhttp 客户端中使用你的拦截器了。

@Singleton
@Provides
fun providesOkhttpClient(
     httpLoggingInterceptor: HttpLoggingInterceptor,
     @ApiKeyInterceptorOkHttpClient apiKeyInterceptor: Interceptor) =
     OkHttpClient.Builder()
         .addInterceptor(httpLoggingInterceptor)
         .addInterceptor(apiKeyInterceptor)
         .connectTimeout(30, TimeUnit.SECONDS)
         .readTimeout(30, TimeUnit.SECONDS)
         .writeTimeout(30, TimeUnit.SECONDS)
         .build()

【讨论】:

    【解决方案2】:
    @Provides
    fun providesLoggingInterceptor(): HttpLoggingInterceptor {
        return HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
    }
    
    
    @Provides
    fun providesOkhttpInterceptor() : Interceptor{
        return  Interceptor { chain: Interceptor.Chain ->
            val original: Request = chain.request()
            val requestBuilder: Request.Builder = original.newBuilder()
                .addHeader("Accept", "Application/JSON")
            val request: Request = requestBuilder.build()
            chain.proceed(request)
        }
    }
    
    
    @Provides
    fun providesOkHttpClient(
        loggingInterceptor: HttpLoggingInterceptor,
        interceptor: Interceptor
    ): OkHttpClient {
        return OkHttpClient.Builder()
            .addInterceptor(loggingInterceptor)
            .addInterceptor(interceptor)
            .callTimeout(30, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS)
            .writeTimeout(30, TimeUnit.SECONDS)
            .build()
    }
    

    【讨论】:

    • 这不是用户要求的解决方案。
    【解决方案3】:

    你可以使用@Qualifier注解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多