文章目录
OkHttpClient.Builder
addInterceptor()
添加拦截器到list中
build()
创建OkHttpClient对象
RequestBody
抽象类,需要实现两个方法
/** Returns the Content-Type header for this body. */
abstract fun contentType(): MediaType?
/** Writes the content of this request to [sink]. */
@Throws(IOException::class)
abstract fun writeTo(sink: BufferedSink)
FormBody:RequestBody
提供builder快速创建,内部含有两个list存储传入的name
和value
,并将其转码
实现父类方法:
- contentType =
"application/x-www-form-urlencoded".toMediaType()
- 按照
&name=value
格式写入
MultipartBody:RequestBody
提供builder快速创建
实现父类方法:
- contentType =
"类型; boundary=输入的类型".toMediaType()
- 按照
--输入的类型\r\nname: value\r\nContent-Type: 当前类型\r\nContent-Length: 当前长度\r\n\r\n内容\r\n--输入的类型--\r\n
格式写入
Request.Builder()
url()
缓存URL
get()
设置方法名称为GET,将方法体设置为null
post(body)
设置方法名称为POST,将方法体设置为body
build()
创建Request对象,限制url不能为null
OkHttpClient().newCall()
创建RealCall
对象,传入client和request
RealCall.enqueue
实现Runnable接口实现execute功能
在线程池中调用,添加到list中,在取消时统一移除
RealCall.execute
- 检查是否已经启动
- 启动超时控制器,达到超时时间,关闭链接
- 触发启动监听
- 缓存正在运行的链接
- 执行
getResponseWithInterceptorChain()
- 获取所有拦截器
- 将信息包装为RealInterceptorChain对象
- 执行proceed
- 如果取消了,抛出异常
- 捕获异常,释放链接
- finally块如果没有异常,释放链接
拦截器
调用顺序:
- 用户定义的全局
- RetryAndFollowUpInterceptor(最大数量MAX_FOLLOW_UPS=20)
- BridgeInterceptor(设置头并压缩数据)
- CacheInterceptor(查寻是否有缓存,查询是否过期等,有则用缓存)
- ConnectInterceptor 遍历连接池,获取一个链接健康的链接
- 自定义的networkInterceptors(如果时websocket)
- CallServerInterceptor(写入请求头信息;写入请求体信息;结束请求;读取响应头信息;获取响应体信息输入流)
责任链模式,每个拦截器执行自己后,执行递归方法