介绍
OkHttps 简介
OkHttps 是 2020 年开源的对 OkHttp3 轻量封装的框架,它独创的异步预处理器,特色的标签,灵活的上传下载进度监听与过程控制功能,在轻松解决很多原本另人头疼问题的同时,设计上也力求纯粹与优雅。
- 链式调用,一点到底
- BaseURL、URL占位符、HTTP、WebSocket
- JSON、Xml 等自动封装与解析,且支持与任意格式的数据解析框架集成
- 同步拦截器、异步预处理器、回调执行器、全局监听、回调阻断
- 文件上传下载(过程控制、进度监听)
- 单方法回调,充分利用 Lambda 表达式
- TCP连接池、Http2
TIP
- OkHttps 非常轻量(最新版仅 90KB),除 Okhttp 无第三方依赖,并且更加的开箱即用,API 也更加自然和语义化。
- OkHttps 是一个纯粹的 Java 网络开发包,并不依赖 Android,这一点和 Retrofit 不同
- OkHttps 用起来很优美,可以像 RxJava 那样链式用,却比 RxJava 更简单。
项目组成
项目 | 最新版本 | 描述 | 仓库 |
---|---|---|---|
okhttps | 3.5.3 | OkHttps 核心模块 | Github Gitee |
okhttps-fastjson | 3.5.3 | 与 fastjson 集成 | Github Gitee |
okhttps-gson | 3.5.3 | 与 gson 集成 | Github Gitee |
okhttps-jackson | 3.5.3 | 与 jackson 集成 | Github Gitee |
okhttps-stomp | 3.5.3 | 超轻量 Stomp 客户端(无第三方依赖) | Github Gitee |
okhttps-xml | 3.5.3 | 超轻量 XML 解析扩展 | Github Gitee |
依赖说明
OkHttps 默认依赖 OkHttp3 的 3.x 的最新 3.14.9 版本,但是已经全面兼容 OkHttp3 的 4.x 版本。默认依赖之所以不是 4.x,主要考虑到:
- OkHttp3 4.x 是用 Kotlin 重写,包体相对较大(约是 3.x 的 1.8 倍)
- 在没有 Kotlin 依赖的纯 Java 项目中,使用 4.x 会存在一些问题。
如果你的项目使用的是 Kotlin 语言,并且想使用 OkHttp3 4.x 的话,可以在项目的依赖文件中添加以下配置来覆盖:
Mavel
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.3</version>
</dependency>
2
3
4
5
Gradle
implementation 'com.squareup.okhttp3:okhttp:4.9.3'
版本迭代
OkHttps 从最初的 httputils 演变而来,期间共经历了 约五十个版本迭代 以及 上千个前后端项目 的生产检验,目前已非常稳定。详细的版本可参见 httputils 版本演变 和 okhttps 版本演变。
虽然目前 OkHttps 已非常稳定,所有暴露的 ISSUE 均已解决,但难免新手在使用的过程中会遇到各种各样的问题(这是学习任何一门框架必不可少的采坑过程),所以我们从 OkHttps 技术交流群里把一些高频问题整理成了一份 常见问题列表,可供大家在遇到困难时参考。
v3.5 的新特性(v3.5.3)
- 增强:
HttpTask
新增 Basic Auth 便捷方法:basicAuth(String username, String password)
- 增强:
HttpTask
新增 Bearer Auth 便捷方法:bearerAuth(String token)
- 增强:
HttpTask
新增 流式文件 上传方法:addFilePara(String name, String type, InputStream stream)
- 增强:
HttpTask
新增 流式文件 上传方法:addFilePara(String name, String type, String fileName, InputStream stream)
- 增强:
HttpTask
新增方法:addFilePara(String name, byte[] content, String fileName)
(since v3.5.1) - 增强:
HttpTask
新增方法:addFilePara(String name, InputStream stream, String fileName)
(since v3.5.1) - 增强:
HttpTask
增强setBodyPara(Object body)
方法:使其可以接受InputStream
类型的 流式报文体 参数 - 增强:
HttpTask
使用ListMap
作为请求参数的内部集合容器:使其可以接受 多个同名参数 并可 保持参数的添加顺序 - 增强:
HTTP
的HTTP.builder()
方法,使之支持通过指定系统环境变量来让该方法返回不同的构建器实现类 - 增强:
HTTP.Builder
新增clearContentTypes()
方法 - 增强:
HttpResult
新增allHeaders()
方法 - 优化:
HttpTask
放松校验:移除 必须将路径参数占位符全部填充的 检查 - 优化:
HttpTask
请求时Content-Type
请求头 不再 默认携带charset
信息 - 优化:
AbstractHttpClient
的mediaType
映射机制 - 完善:
OkHttpBuilderImpl
常见的mediaType
映射 - 完善:
DownloadHelper
添加更多常见的扩展名映射 - 重构:
java.util.function.Supplier
替代com.ejlchina.okhttps.PingSupplier
接口 - 重构:
java.util.function.Consumer
替代com.ejlchina.okhttps.OnCallback
接口 - 升级:
data
:v1.1.2
->v1.4.1
:https://gitee.com/troyzhxu/data/releasesMapper
新增toBean(Class<T> type)
、toBean(TypeRef<T> type)
与toBean(Type type)
方法Array
新增toList(Class<T> type)
方法DataConvertor
新增:toMapper(String in)
、toArray(String in)
、serialize(Object object)
、toBean(Type type, String in)
、toList(Class<T> type, String in)
方法Deserializer
新增getInstance()
方法fastjson
:v1.2.79
->v1.2.80
jackson
:v2.12.6
->v2.13.2.2
- 新增
ListMap
接口 与ArrayListMap
/LinkedListMap
相关实现类
- 过时:
HttpResult
的getHeaders()
方法标记为已过时 - 过时:
HttpResult.Body
的getType()
方法标记为已过时
提示
低版本 Android 升级到 v3.5.x
时,请仔细阅读 版本兼容 章节。
v3.4 的新特性(v3.4.7)
- 重构:
HttpTask
的addBodyPara(..)
方法,使支持多层数据结构(JSON/XML) - 优化: Stomp,在
OnError/OnException
时重置 connecting 状态 HttpTask
新增boundary(String boundary)
方法,用于自定义上传文件时 MultipartBody 的边界符(since v3.4.2)- 调用
addFilePara(..)
上传文件时,支持指定以multipart/
开头的bodyType
,来修改默认的multipart/form-data
请求类型(since v3.4.2) - 构建 HTTP 实例时支持配置
DownloadHelper
,可自定义下载文件时文件名生成规则(since v3.4.2) - 优化默认下载文件名生成逻辑,在未指定文件名的情况下更据
Content-Type
自动生成文件的扩展名(since v3.4.2) - Stomp 重复订阅时不再抛异常,只输出错误日志(since v3.4.6)
注意
v3.4.0
基于 java 11
构建,如果您使用的是 java 8
,请使用 v3.4.1 +
版本
v3.3 的新特性(v3.3.2)
- 兼容
JDK9+
的模块引入机制 - 类
HTTP.Builder
接口化,试图与 okhttp3 解耦 - 以下 类名/包名 重构:
v3.3.0 以前 | v3.3.0 及以后 |
---|---|
com.ejlchina.okhttps.internal.SyncHttpTask | com.ejlchina.okhttps.SHttpTask |
com.ejlchina.okhttps.internal.AsyncHttpTask | com.ejlchina.okhttps.AHttpTask |
com.ejlchina.okhttps.internal.WebSocketTask | com.ejlchina.okhttps.WHttpTask |
com.ejlchina.okhttps.internal.TaskExecutor | com.ejlchina.okhttps.TaskExecutor |
com.ejlchina.okhttps.internal.HttpException | com.ejlchina.okhttps.OkHttpsException |
com.ejlchina.okhttps.FastjsonMsgConvertor | com.ejlchina.okhttps.fastjson.FastjsonMsgConvertor |
com.ejlchina.okhttps.GsonMsgConvertor | com.ejlchina.okhttps.gson.GsonMsgConvertor |
com.ejlchina.okhttps.JacksonMsgConvertor | com.ejlchina.okhttps.jackson.JacksonMsgConvertor |
com.ejlchina.okhttps.XmlMsgConvertor | com.ejlchina.okhttps.xml.XmlMsgConvertor |
- 增强 HttpTask.addFilePara 方法的 type 参数,可直接传 MediaType 全称(since v3.3.1)
- Websocket 支持设置 最大 Closing 时长,即在 OnClosing 回调执行后的指定时间内,可以保证 OnClosed 回调一定被执行(since v3.3.1)
v3.2 的新特性(v3.2.0)
- HttpTask 新增方法:addFilePara(String name, String type, String filePath)
- HttpTask 新增方法:addFilePara(String name, String type, File file)
- 优化异步请求回调机制:取消请求时,仍然执行 OnComplete 回调
- 所有回调执行完毕后,HttpTask 不再可以取消,调用 cancel 时将返回 false
- 新增枚举 Download.Status 类型,替换下载状态的整型常量
- 下载控制器 Download.Ctrl 的 pause、resume 和 cancel 方法新增 boolean 返回值,表示是否操作成功
- 当下载指定的目标文件不存在时,同样执行 onFailure 回调
- Download 新增 OnComplete 下载结束回调(成功、失败、取消都执行)
- 优化 HTTP.Builder.config(OkConfig config) 方法,支持多次注入配置
v3.1 的新特性(v3.1.5)
- 类
OkHttps
与HttpUtils
开放getHttp()
方法 - 类
WebSocketTask
新增close
方法,用于关闭当前连接 - 优化
WebSocketTask
:同一时间只能建立一个连接,如果已经建立连接并未断开,重复调用listen()
方法将直接返回原有连接 - 类
Stomp
新增disconnect(int maxWaitSeconds)
方法 - 类
Stomp
新增disconnect(boolean immediate)
方法,用于立即断开连接 - 类
Stomp
新增isConnecting()
与isDisconnecting()
方法 - Stomp 模块抽象出
MsgCodec
接口,使得编解码模块易于扩展 - Stomp 模块新增
MsgCodecImpl
实现类,并实现了半包粘包处理逻辑 - Stomp 新增异常回调:
setOnException(OnCallback<Throwable> onException
)(since v3.1.1)
v3.0 的新特性(v3.0.4)
JSON、XML 等结构化数据的统一抽象 API 分离作为独立的项目维护:
依赖 data 项目中新增 HashMapper 与 ListArray 两个实现类
升级事项: 用到以下四个类需要重新导包:
v2.x | v3.x |
---|---|
com.ejlchina.okhttps.DataSet | com.ejlchina.data.DataSet |
com.ejlchina.okhttps.Array | com.ejlchina.data.Array |
com.ejlchina.okhttps.Mapper | com.ejlchina.data.Mapper |
com.ejlchina.okhttps.TypeRef | com.ejlchina.data.TypeRef |
- Stomp 在连接断开时重置 Subscriber 的状态,以便在重连后可以自动订阅(v3.0.3)
- 重构 bodyType 与 Content-Type 机制,实现用户可以指定在 Content-Type 头中是否携带字符编码(v3.0.3)
v2.5 的新特性(v2.5.1)
API 部分
HTTP#Builder
新增contentTypes
方法,可扩展配置默认支持的请求类型HTTP#Builder
新增clearPreprocessors
、clearMsgConvertors
方法HttpResult
新增getTask
方法,可获取所属的请求任务HttpResult
新增of(HttpTask<?>, Response)
方法,可构造一个HttpResult
实例WebSocketTask
新增flexiblePing(boolean)
方法,当传参false
时,可兼容某些强制客户端必须以固定的间隔发送心跳的服务器Stomp
新增sendToTopic
与sendToQueue
方法,Stomp
新增isConnected
方法,可直接判断连接是否已建立
优化部分
- 优化自定义请求方法
HttpTask#request()
的参数处理:请求方法自动 toUpperCase,避免用户传入小写时造成意想不到的问题 - 优化
bodyType
与msgType
的参数处理,自动 toLowerCase,避免用户传入大写时造成意想不到的问题 - 使得未添加
MsgConvertor
时,使用setBodyPara(String|byte[])
与bodyType
方法也能够发起对应格式的请求 - 优化 Stomp 订阅与退订机制:同一个实例支持多线程并发订阅与退订操作
- 优化 Stomp 消息匹配机制:兼容 RabbitMQ 在某些情况下的推送的 消息目的地 与 订阅目的地 不一致的情况
- 优化 Stomp 连接的断开流程:在连接断开前保证已发消息到达服务器
- 优化文件下载的异常处理流程
升级注意事项:
- 类
FilePara
从HttpTask
中分离,不再是HttpTask
的内部类,有直接引用FilePara
的代码需要重新导包。
v2.4 的新特性(v2.4.5)
- 全面兼容 OkHttp 4.x 版本
- HttpTask 新增
getPathParas()
、getUrlParas()
、getBodyParas()
、getFileParas()
、getRequestBody()
方法 - 优化
HttpTask#addFilePara(String name, String type, byte[] content)
方法,添加自动生成文件名逻辑,兼容某些必须要提供文件名才能接受到文件的后端接口 - Stomp 新增
setOnError
方法,可监听处理处理服务器发出的 ERROR 帧 - 新增超轻量无第三方依赖的 XML 解析扩展(v2.4.2 起)
- 同一个 HttpResult 和 HttpBody 可以多线程并发访问(v2.4.3 起)
- Websocket 新增 status() 方法,可查看当前连接的状态,WebSocketTask 新增 isConnected() 方法,可以判断是否已连接(v2.4.5 起)
- 抽象 DataSet(只读数据集)接口,Mapper 和 Array 为其子接口(v2.4.5 起)
v2.3 的新特性(v2.3.0)
重新实现 WebSocket 心跳机制 使用者可以选择使用 OkHttp 自带的心跳机制,也可以选择使用 OkHttps 提供的增强型心跳机制,它具有如下特性
- 客户端发送的任何消息都具有一次客户端心跳作用
- 服务器发送的任何消息都具有一次服务器心跳作用
- 若服务器超过 3 * pongSeconds 秒没有回复心跳,才判断心跳超时
- 可指定心跳的具体内容(默认为空)
v2.2 的新特性(v2.2.0)
- 增强泛型反序列化,支持复合泛型
- HttpCall 接口新增 getTask 方法,可获取当前任务
- OkHttps 工具类 新增 newBuilder 方法,可用于复制 SPI 方式注入的配置信息
- HttpTask 类 新增 isAsyncHttp 和 isSyncHttp 方法(v2.1.0 新增了 isWebsocket 方法)可用于判断 HttpTask 的任务类型
- 优化在 Android 端的异步请求性能
v2.1 的新特性(v2.1.0)
- 对异步请求的响应提供了 6 种便捷回调方法,在不关心具体状态时(与全局响应监听组合使用),使用非常方便;
setOnResBody
在回调里直接取得Body
对象,无需再使用res.getBody()
setOnResBean
在回调里直接取得 Java Bean 对象,无需再使用res.getBody().toBean(Class<?>)
setOnResList
在回调里直接取得 Java List 列表,无需再使用res.getBody().toList(Class<?>)
setOnResMapper
在回调里直接取得 Mapper 对象,无需再使用res.getBody().toMapper()
setOnResArray
在回调里直接取得 Array 对象,无需再使用res.getBody().toArray()
setOnResString
在回调里直接取得 String 对象,无需再使用res.getBody().toString()
- 优化性能:使用
HTTP#newBuilder()
方法克隆HTTP
实例时,新实例与旧实例之间资源共享最大化。
v2.0 的新特性(v2.0.1)
- HTTP 任务新增
patch()
和head()
方法,可发起 PATCH 和 HEAD 请求,目前直接支持的 HTTP 方法有:GET、POST、PUT、PATCH、DELETE,并且暴露了request(String method)
方法,可自定义发起任何请求,如:HEAD、OPTIONS、TRACE、CONNECT 等; - HTTP 任务新增
skipPreproc()
和skipSerialPreproc()
方法,具体请求可跳过 所有 或只跳过 串行 预处理器; - 新增
MsgConvertor
接口,实现 OkHttps 与 fastjson 解耦,且不再依赖某个具体 json 框架、甚至不依赖 json,它可以与 任何格式 的数据解析框架集成,如:json 、xml 、protobuf 等; - 构建
HTTP
实例时支持注入多个MsgConvertor
,可实现同一个HTTP
实例下,既有 json 解析,又有 xml 解析等强大特性,同时还可以让表单(form)请求参数 同 json、xml 一样,支持序列化功能。 HTTP
接口新增webSocket(String url)
方法,与sync(String url)
和async(String url)
一样,支持 Lamda 编程、预处理器机制、消息数据自动序列化和反序列化机制;- 新增
OkHttps
工具类,支持 SPI 方式注入配置,OkHttps
和HttpUtils
默认自动以 SPI 方式寻找依赖中的MsgConvertor
; - 新增可自定义默认编码(不自定义依然默认为 utf-8)、具体请求可指定特殊编码功能。