Net总共支持两种拦截器
你的业务可能需要加密解密. 但请不要封装Post/Get等请求动作(这是不明智的做法)
建议自定义拦截器和转换器可以应对任何项目需求, 同时更符合架构设计
添加拦截器
class App : Application() {
override fun onCreate() {
super.onCreate()
NetConfig.initialize("https://github.com/liangjingkanji/Net/", this) {
addInterceptor(RefreshTokenInterceptor())
}
}
}
以下为简单演示客户端自动刷新token拦截器
/**
* 演示如何自动刷新token令牌
*/
class RefreshTokenInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
val response = chain.proceed(request) // 如果token失效
return synchronized(RefreshTokenInterceptor::class.java) {
if (response.code == 401 && UserConfig.isLogin && !request.url.pathSegments.contains("token")) {
val json = Net.get("token").execute<String>() // 同步刷新token
UserConfig.token = JSONObject(json).optString("token")
chain.proceed(request)
} else {
response
}
}
}
}
在拦截器中可以使用以下函数复制请求/响应体
| 函数 | 描述 | |-|-| | peekString | 可以复制截取RequestBody/ResponseBody, 且返回String | | logString | 等效于上面函数, 但是Response仅支持文本/JSON, Request仅支持FormBody |
RequestInterceptor属于轻量级的请求拦截器, 在每次请求的时候该拦截器都会被触发. 一般用于添加全局的参数和请求头
初始化时添加请求拦截器的示例代码
NetConfig.initialize("https://github.com/liangjingkanji/Net/", this) {
setRequestInterceptor(object : RequestInterceptor {
override fun interceptor(request: BaseRequest) {
request.param("client", "Net")
request.setHeader("token", "123456")
}
})
}
可以看到setRequestInterceptor
是set开头. 仅支持一个请求拦截器, 不像addInterceptor
支持多个请求拦截器