本文作者
作者:不怕天黑
链接:
https://juejin.im/post/5ded221a518825125d14a1d4
本文由作者授权发布。
1 前言RxHttp在今年4月份一经推出,就受到了广大Android 开发者的喜爱,截止本文发表在github上已有800+star,为此,我自己也建个RxHttp&RxLife 的群(群号:378530627)
https://github.com/liujingxing/RxHttp
目前群里也有将近120号人,里面有不少小伙伴提了很多有价值的创意,才使得RxHttp一直坚持走到了现在,在此,感谢大家的喜爱。
这期间,一直有人问我,retrofit不香吗?
之前不知道该如何回答这个问题,现在我想说,香!!retrofit无疑是目前综合得分最高的选手,但它也有它的不足。
RxHttp相较于retrofit,功能上,两者均能实现,并无多大差异,更多的差异体现功能的使用上,也就是易用性,如对文件上传/下载/进度监听的操作上,RxHttp用及简的API,可以说碾压retrofit;
另外在baseUrl、公共参数/请求头、请求加解密等功能上的易用性都要优于retrofit;然而这些,个人觉得都不算什么,个人觉得RxHttp最大的优势在于它近乎为0的上手成本、及简的API以及高扩展性,看完这篇文章,相信你会有同感。
那RxHttp就没有缺点吗?
有,那就是它的稳定性目前还不如retrofit,毕竟RxHttp刚出道8个月,且全部是我一个人在维护,当然,并不是说RxHttp不稳定,RxHttp未开源前,在我司的项目已经使用了近2年,接着今年4月份将其开源,至今大大小小已迭代20多个版本,目前用的人也不在少数,可以说很稳定了。
2 简介RxHttp是基于OkHttp的二次封装,并与RxJava做到无缝衔接,一条链就能发送任意请求。主要优势如下:
1. 支持Gson、Xml、ProtoBuf、FastJson等第三方数据解析工具
2. 支持Get、Post、Put、Delete等任意请求方式,可自定义请求方式
3. 支持在Activity/Fragment/View/ViewModel/任意类中,自动关闭请求
4. 支持统一加解密,且可对单个请求设置是否加解密
5. 支持添加公共参数/头部,且可对单个请求设置是否添加公共参数/头部
6. 优雅的实现文件上传/下载及进度的监听,且支持断点下载
7. 优雅的对错误统一处理,且不打破Lambda表达式
8. 优雅的处理多个BaseUrl及动态BaseUrl
9. 30秒即可上手,学习成本极低
gradle依赖
implementation 'com.rxjava.rxhttp:rxhttp:1.3.4'
//注解处理器,生成RxHttp类,即可一条链发送请求
annotationProcessor 'com.rxjava.rxhttp:rxhttp-compiler:1.3.4'
//管理RxJava及生命周期,Activity/Fragment 销毁,自动关闭未完成的请求
implementation 'com.rxjava.rxlife:rxlife:1.1.0'
//非必须 根据自己需求选择Converter RxHttp默认内置了GsonConverter
implementation 'com.rxjava.rxhttp:converter-jackson:1.3.4'
implementation 'com.rxjava.rxhttp:converter-fastjson:1.3.4'
implementation 'com.rxjava.rxhttp:converter-protobuf:1.3.4'
implementation 'com.rxjava.rxhttp:converter-simplexml:1.3.4'
注:kotlin用户,请使用kapt替代annotationProcessor
3 使用3.1、准备工作
RxHttp 要求项目使用Java 8,请在 app 的 build.gradle 文件中添加以下代码
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
此时,再Rebuild一下项目(通过Rebuild生成RxHttp类),就可以开始RxHttp的入坑之旅
3.2、配置默认的BaseUrl
通过@DefaultDomain注解配置默认域名,如下:
public class Url {
@DefaultDomain //设置为默认域名
public static String baseUrl = "https://www.wanandroid.com/";
}
此步骤是非必须的,这里先介绍@DefaultDomain注解的用法,更多有关域名的介绍,请查看本文3.6章节----多域名/动态域名
3.3、请求三部曲
先来看看如何发送一个最简单的请求,如下
RxHttp.get("http://...") //第一步, 通过get、postXxx、putXxx等方法,确定请求类型
.asString() //第二步, 通过asXxx系列方法,确定返回数据类型
.subscribe(s -> { //第三步, 订阅回调(此步骤同RxJava订阅观察者)
//请求成功
}, throwable -> {
//请求失败
});
是的,不用怀疑,就是这么简单,重要的事情说3遍
任意请求,任意返回数据类型,皆遵循请求三部曲
任意请求,任意返回数据类型,皆遵循请求三部曲
任意请求,任意返回数据类型,皆遵循请求三部曲
到这,你已经掌握了RxHttp的精髓,我们只需牢记请求三部曲,使用RxHttp就会得心应手。
3.3.1、第一部曲:确定请求类型
RxHttp内部共提供了14个请求方法,如下:
RxHttp.get(String) //get请求 参数拼接在url后面
RxHttp.head(String) //head请求 参数拼接在url后面
RxHttp.postForm(String) //post请求 参数以{application/x-www-form-urlencoded}形式提交
RxHttp.postJson(String) //post请求 参数以{application/json; charset=utf-8}形式提交,发送Json对象
RxHttp.postJsonArray(String) //post请求 参数以{application/json; charset=utf-8}形式提交,发送Json数组
RxHttp.putForm(String) //put请求 参数以{application/x-www-form-urlencoded}形式提交
RxHttp.putJson(String) //put请求 参数以{application/json; charset=utf-8}形式提交,发送Json对象
RxHttp.putJsonArray(String) //put请求 参数以{application/json; charset=utf-8}形式提交,发送Json数组
RxHttp.patchForm(String) //patch请求 参数以{application/x-www-form-urlencoded}形式提交
RxHttp.patchJson(String) //patch请求 参数以{application/json; charset=utf-8}形式提交,发送Json对象
RxHttp.patchJsonArray(String) //patch请求 参数以{application/json; charset=utf-8}形式提交,发送Json数组
RxHttp.deleteForm(String) //delete请求 参数以{application/x-www-form-urlencoded}形式提交
RxHttp.deleteJson(String) //delete请求 参数以{application/json; charset=utf-8}形式提交,发送Json对象
RxHttp.deleteJsonArray(String) //delete请求 参数以{application/json; charset=utf-8}形式提交,发送Json数组
以上14个请求方法你会发现,其实就6个类型,分别对应是Get、Head、Post、Put、Patch、Delete方法,只是其中Post、Put、Patch、Delete各有3个方法有不同形式的提交方式,只需要根据自己的需求选择就好。
如以上方法还不能满足你的需求,我们还可以通过@Param注解自定义请求方法,有关注解的使用,本文后续会详细介绍。
注:当调用xxxForm方法发送请求时,通过setMultiForm()方法或者调用addFile(String, File)添加文件时,内部会自动将参数以{multipart/form-data}方式提交
添加参数/请求头确定请求方法后,我们就可以调用一系列addXxx()方法添加参数/请求头,如下:
RxHttp.get("/service/...") //发送get请求
.add("key", "value") //添加参数
.addAll(new HashMap<>()) //通过Map添加多个参数
.addHeader("deviceType", "android") //添加请求头
...
任意请求,都可调用以上3个方法添加参数/请求头,当然,在不同的请求方式下,也会有不同的addXxx方法供开发者调用。
如下:
//postJson请求方法下会有更多addAll等方法可供调用
RxHttp.postJson("/service/...") //发送post Json请求
.addAll(new JsonObject()) //通过json对象添加多个参数
.addAll("{\"height\":180,\"weight\":70}") //通过json字符串添加多个参数
...