场景:在网络请求中,有些接口需要添加token认证,有些接口不需要

  1. 自定义注解类
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Token {
boolean value() default true;
}
  1. Interceptor拦截器中实现

Java:

@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
// 重新进行build
Request.Builder builder = original.newBuilder();
final Token annotation = Objects.requireNonNull(original.tag(Invocation.class)).method().getAnnotation(Token.class);
String accessToken = CacheUtil.getAccessToken();
//Token注解为空,或者value 是 true的时候注入Token
if (annotation == null || annotation.value()) {
//全局添加请求头token
if (!TextUtils.isEmpty(accessToken)) {
// 注入一个token
builder.addHeader(ACCESS_TOKEN_NAME, "bearer " + accessToken);
}
}
builder.addHeader(AUTHORIZATION,AUTHORIZATION_VALUE);
return response;
}

Kotlin:

override fun intercept(chain: Interceptor.Chain): Response {
val original = chain.request()
//重新 build
val builder = original.newBuilder()
//获取Response
val response = chain.proceed(builder.build())
//添加公共头
builder.addHeader(AUTHORIZATION, AUTHORIZATION_VALUE)
//拿到注解类Token.kt
val annotation =
original.tag(Invocation::class.java)?.method()?.getAnnotation(Token::class.java)
//没有注解,或者注解的属性 value 是 true的时候注入token
annotation?.value.run {
accessToken?.let {
builder.addHeader(ACCESS_TOKEN_NAME,"bearer $it")
}
}
return response
}

3.使用:在 Service接口的方法上,添加注解

@Token(value = false) //或者 @Token 或者 @Token(value = true)
suspend fun login(
@Field("username") username: String,
@Field("password") password: String
): LoginClient