思路
- 提取重复逻辑:将拦截器之间的重复逻辑提取出来,封装成一个独立的方法或类。
- 抽象拦截器:创建一个抽象的拦截器类,将重复逻辑放在抽象类中,让具体的拦截器继承这个抽象类,从而复用这些逻辑。
- 责任链构建:按照责任链模式的规则,在拦截器链中依次调用各个拦截器,每个拦截器在处理请求时,可以先调用抽象类中的重复逻辑,然后再执行自己特有的逻辑。
关键代码片段
- 抽象拦截器类
abstract class BaseInterceptor : Interceptor {
// 提取的重复逻辑
protected fun commonLogic(request: Request): Request {
// 例如添加通用的请求头
return request.newBuilder()
.addHeader("Common-Header", "Value")
.build()
}
override fun intercept(chain: Interceptor.Chain): Response {
val newRequest = commonLogic(chain.request())
return onIntercept(chain, newRequest)
}
protected abstract fun onIntercept(chain: Interceptor.Chain, request: Request): Response
}
- 具体拦截器
class SpecificInterceptor1 : BaseInterceptor() {
override fun onIntercept(chain: Interceptor.Chain, request: Request): Response {
// 自己特有的逻辑
val modifiedRequest = request.newBuilder()
.addHeader("Specific1-Header", "Value1")
.build()
return chain.proceed(modifiedRequest)
}
}
class SpecificInterceptor2 : BaseInterceptor() {
override fun onIntercept(chain: Interceptor.Chain, request: Request): Response {
// 自己特有的逻辑
val modifiedRequest = request.newBuilder()
.addHeader("Specific2-Header", "Value2")
.build()
return chain.proceed(modifiedRequest)
}
}
- 构建OkHttp客户端与责任链
val client = OkHttpClient.Builder()
.addInterceptor(SpecificInterceptor1())
.addInterceptor(SpecificInterceptor2())
.build()