Android okhttp网络请求封装 拦截器Interceptor 和嵌套解析的问题解决(4)

上一节有个问题,就是嵌套解析有问题,什么是嵌套解析呢?比如你最外层是一个body,里面是不是一般里面都有一个data,常规解析方法是先解析最外层body,再解析里面的data,这种方法比较麻烦,这里就可以通过嵌套解析的方法来一次性解析,这一节使用啦拦截器,拦截器不名思意就是拦截请求使用到的,为何要拦截器呢?比如要给请求追加一些东西(比如header等等)这时就需要拦截器,学过java后端的又对拦截器比较了解的,因为每一次对后端的请求,可以做到拦截验证该请求是否有该权限,同理:
直接上代码:
修改OkhttpUtils类:
@Synchronized
fun getInstance():OkhttpUtils{
if (instance == null) instance = OkhttpUtils()
okhttp = OkHttpClient().newBuilder()
.retryOnConnectionFailure(true)
.connectTimeout(10000, TimeUnit.SECONDS) //连接超时
.readTimeout(10000, TimeUnit.SECONDS) //读取超时
.writeTimeout(10000, TimeUnit.SECONDS) //写超时
.addInterceptor(HttpInterceptor())//添加拦截器
.build()
return instance!!
}
修改OkhttpCallBack类:
class OkhttpCallBack : Callback{

private var mOkHttpCall: OkHttpCall<T>? = null
private var  mTypeToken:TypeToken<RequestBodyContent<T>>? = null

constructor()

constructor(okHttpCall: OkHttpCall<T>,typeToken:TypeToken<RequestBodyContent<T>>){
    mOkHttpCall = okHttpCall
    mTypeToken = typeToken
}



override fun onFailure(call: Call, e: IOException) {
    mOkHttpCall?.onError("")
}

override fun onResponse(call: Call, response: Response) {
    val body: String? = response.body?.string();
    response.body?.let {
        //一定要Dispatchers.Main 不然协程不会切换线程
        GlobalScope.launch(Dispatchers.Main) {
            body?.let { it1 ->
                val content: RequestBodyContent<T>? = JsonUtils.jsonTo2(it1,
                    mTypeToken)
                Log.e("token",content.toString())
                mOkHttpCall?.onSuccess(content)
            }
        }

    }
}

interface OkHttpCall<T>{
    fun onSuccess(requestBody: RequestBodyContent<T>?);
    fun onError(error: String);
}

}
新增HttpInterceptor类:
class HttpInterceptor: Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request: Request = chain.request()
return chain.proceed(request)
}
}

JsonUtils修改类:
fun jsonTo2(json: String?, typeEntity: TypeToken<RequestBodyContent>?): RequestBodyContent? {
val type:Type = typeEntity!!.type
return Gson().fromJson(json, type)
}

使用方法:这里的map对象就是hashmap请求参数 Zodiac就是实体类 RequestBodyContent是最外层的类
val datType:TypeToken<RequestBodyContent> = object : TypeToken<RequestBodyContent>(){};
with(OkhttpUtils){
getInstance().postJsonRequest(map,“url”, OkhttpCallBack(
object : OkhttpCallBack.OkHttpCall{
override fun onSuccess(requestBody: RequestBodyContent?) {
Log.e(“”,“” + requestBody?.result?.name)

                }

                override fun onError(error: String) {

                }

            }
       ,datType))

    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值