在改造中,我如何在请求中使用Tag作为参数值而不使用Call?



Retrofit:我想使用Tag注释在请求中传递一些数据,然后我想从拦截器拦截该数据。

像这样

我如何像这样使用它,但不使用Call

@Target(AnnotationTarget.VALUE_PARAMETER,
AnnotationTarget.FUNCTION
)
@Retention(AnnotationRetention.RUNTIME)
annotation class Tagz
@GET
suspend fun getUsers(@Tagz value: CachePolicy.Type, @Url placeholder: String): Response<UserEntity?>

使用上面的代码会给我带来这样的问题:

java.lang.IllegalArgumentException: No Retrofit annotation found. (parameter #1)

我如何在参数中传递我的值作为请求中的标记?

顺便说一句:我可以使用这样的标签

@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
@Retention(AnnotationRetention.RUNTIME)
annotation class CachePolicyTag(val value: CachePolicy.Type)
@GET
@CachePolicyTag(CachePolicy.Type.DefaultCache)
suspend fun getUsers(@Url placeholder: String): Response<UserEntity?>

但是我想把它作为参数传递给这个挂起函数,而不是一个注释函数。

我使用了retrofit @TAG来传递标签值并在okhttp拦截器中拦截。

@GET
suspend fun getUsers(@Tag cacheType: CachePolicy.Type, @Url placeholder: String): Response<UserEntity?>

和Okhttp拦截器

override fun intercept(chain: Interceptor.Chain): Response {
val request =  chain.request() 
val response = chain.proceed(request)
request.tag(Invocation::class.java)?.let {
kotlin.runCatching {
val cachePolicyType = it.arguments()[0] as CachePolicy.Type
} 
}
return response
}

在任何错误或类强制转换异常的情况下,它也不会抛出任何异常到runCatching块之外。

相关内容

  • 没有找到相关文章

最新更新