okhttp源码分析

本文介绍了OkHttp的基本概念,使用方法以及源码分析。OkHttp是Android常用的网络框架,由Square公司开发。文章详细讲解了如何创建OkHttpClient,构建Request,同步与异步请求的执行流程,以及Dispatcher在请求分发中的作用。核心在于通过拦截器链完成网络请求,每个拦截器承担不同任务。
摘要由CSDN通过智能技术生成

一、okhttp简介

OKHttp是一个处理网络请求的开源项目,Android 当前最火热网络框架,由移动支付Square公司贡献,用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient)。现在在Android开发中最火的应用最多的联网框架毫无疑问是okhttp,目前已经大量替代了Volley、HttpUrlConnection。

二、okhttp用法
1)导包:

    compile 'com.squareup.okhttp3:okhttp:3.9.1'

2)通过Builder类实例化客户端类OkhttpClient。

 private val client: OkHttpClient by lazy {
        OkHttpClient.Builder()
            .connectTimeout(30, TimeUnit.SECONDS)
            .readTimeout(60, TimeUnit.SECONDS)
            .writeTimeout(60, TimeUnit.SECONDS)
            .build()
    }

实例化OkhttpClient时可以通过Builder类添加一系列客户端参数。
3)通过Builder类实例化请求类Request,通过OkHttpClient的newCall方法执行请求。

 fun get(url: String, callBack: ResponseCallBack) {
        var request = Request.Builder()
            .url(Api.baseUrl + url)
            .build()
        client.newCall(request).enqueue(
            object : Callback {
                override fun onFailure(call: Call, e: IOException) {
                    callBack?.onFail(e.toString())
                }

                override fun onResponse(call: Call, response: Response) {
                    callBack?.onSuccess(response.body()!!.string())
                }

            }
        )
    }

    fun post(url: String, requestParams: RequestParams, callBack: ResponseCallBack) {
        var requestBody = FormBody.Builder()
        requestParams.forEach {
            requestBody.add(it.key, it.value.toString())
        }
        var request = Request.Builder()
            .url(Api.baseUrl + url)
            .post(requestBody.build())
            .build()
        client.newCall(request).enqueue(
            object : Callback {
                override fun onFailure(call: Call, e: IOException) {
                    callBack?.onFail(e.toString())
                }

                override fun onResponse(call: Call, response: Response) {
                    callBack?.onSuccess(response.body()!!.string())
                }
            }
        )
    }

实例化Request时可以通过Builder类添加一系列请求参数(例如Header信息),这里也不进行详细描述,在分析源码时进行具体分析。
4)同步、异步请求。execute()执行同步请求,enqueue()执行异步请求,同步请求方法返回Response,异步请求通过CallBack返回Response。

三、源码分析
1)OkHttpClient客户端类,主要看一下各个成员变量。

final Dispatcher dispatcher;//请求分发器,分发执行Request
  final @Nullable Proxy proxy;//代理
  final List<Protocol> protocols;//协议,管理协议版本
  final List<ConnectionSpec> connectionSpecs;//传输层版本和连接协议
  final List<Interceptor> interceptors;//拦截器
  final List<Interceptor> networkInterceptors;//网络拦截器
  final EventListener.Factory eventListenerFactory;//请求监听器
  final ProxySelector proxySelector;//代理选择
  final CookieJar cookieJar;//cookie
  final @Nullable Cache cache;//缓存
  final @Nullable InternalCache internalCache;//内部缓存
  final SocketFactory socketFactory;//socket工厂
  final @Nullable SSLSocketFactory sslSocketFactory;//HTTPS ssl安全套接层工厂
  final @Nullable CertificateChainCleaner certificateChai
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值