OkHttp的基本封装
一、使用步骤
-
构建
client
-
配置参数
-
构建
request
-
执行请求
call.execute/enquene
-
GET请求
-
POST请求
-
//client val okClient = OkHttpClient.Builder() .callTimeout(10, TimeUnit.SECONDS)//完整请求超时时长,从发起到接收返回数据,默认值0,不限 .connectTimeout(10, TimeUnit.SECONDS)//与服务器建立连接的时长,默认10s .readTimeout(10, TimeUnit.SECONDS)//读取服务器返回数据的时长 .writeTimeout(10, TimeUnit.SECONDS)//向服务器写入数据的时长,默认10s .cache(Cache(mCacheFile, 1024))//http 的缓存大小,位置 .cookieJar(CookieJar.NO_COOKIES)//不使用cookie,若用,自定义cookieJar实现 .build()
二、优化点
-
抽象接口封装
-
配置
CookieJar
,网络日志工具,重试机制 -
管理请求
cancel/cancelAll
-
发送三个请求,有一个请求想要取消,request添加tag标记
-
三、okhttp封装步骤
1 添加库
implementation("com.squareup.okhttp3:okhttp:4.8.0") implementation("com.squareup.okhttp3:logging-interceptor:4.8.0") implementation("com.google.code.gson:gson:2.8.6") implementation("com.squareup.retrofit2:retrofit:2.9.0") implementation("com.squareup.retrofit2:converter-gson:2.9.0") implementation 'com.blankj:utilcodex:1.29.0'
2
* 网络请求的接口回调 */ interface IHttpCallback { /** * 网络请求成功的回调 * [data] 返回回调的数据结果 * @param data 返回回调的数据结果 */ fun onSuccess(data: Any?) /** * 接口回调失败 * [error] 错误信息的数据类 */ fun onFailed(error: Any?) }
3
interface HttpApi { /** * 抽象的http的get请求封装,异步 */ fun get(params: Map<String, Any>, urlStr: String, callback: IHttpCallback) /** * 抽象的http同步的 get请求 */ fun getSync(params: Map<String, Any>, urlStr: String): Any? { return Any() } /** * 抽象的http的post的请求 异步 */ fun post(body: Any, urlStr: String, callback: IHttpCallback) /** * 抽象的Http的post 同步请求 */ fun postSync(body: Any, urlStr: String): Any? = Any() 这种方式也可以 fun cancelRequest(tag: Any) fun cancelAllRequest() }
4
class OkHttpApi private constructor() : HttpApi { var maxRetry = 0//最大重试 次数 //存储请求,用于取消 private val callMap = SimpleArrayMap<Any, Call>() //okHttpClient private val defaultClient = OkHttpClient.Builder() .callTimeout(10, TimeUnit.SECONDS)//完整请求超时时长,从发起到接收返回数据,默认值0,不限定, .connectTimeout(10, TimeUnit.SECONDS)//与服务器建立连接的时长,默认10s .readTimeout(10, TimeUnit.SECONDS)//读取服务器返回数据的时长 .writeTimeout(10, TimeUnit.SECONDS)//向服务器写入数据的时长,默认10s .retryOnConnectionFailure(true)//重连 .followRedirects(false)//重定向 .cache(Cache(File("sdcard/cache", "okhttp"), 1024))//缓存数据 // .cookieJar(CookieJar.NO_COOKIES) 登录状态通过cookie实现的 .cookieJar(LocalCookieJar())//自定义CookieJar实现 .addNetworkInterceptor(CniaoInterceptor())//公共header的拦截器 .addNetworkInterceptor(KtHttpLogInterceptor { logLevel(KtHttpLogInterceptor.LogLevel.BODY) })//添加网络拦截器,可以对okHttp的网络请求做拦截处理,不同于应用拦截器,这里能感知所有网络状态,比如重定向。 .addNetworkInterceptor(RetryInterceptor(maxRetry)) // .hostnameVerifier(HostnameVerifier { p0, p1 -> true }) // .sslSocketFactory(sslSocketFactory = null,trustManager = null) .buil