开胃菜
话不多说,30s倒计时开始,先来看看如何发送一个Get请求,如下:
RxHttp.get("http://...") //第一步,确定请求类型,这里为Get请求
.asString() //第二步,确定返回类型,这里返回String类型
.subscribe(s -> { //第二步,订阅观察者,第二步返回Observable对象
//请求成功
}, throwable -> {
//请求失败
});
Ok,倒计时结束!!! 到这,你已经学会了RxHttp的精髓。
是的,不用怀疑,就是这么简单,使用RxHttp,任意请求,任意返回数据类型,都遵循这三个步骤,我们称之为请求三部曲。
重要事情说3遍
任意请求,任意返回数据类型,皆遵循请求三部曲
任意请求,任意返回数据类型,皆遵循请求三部曲
任意请求,任意返回数据类型,皆遵循请求三部曲
gradle依赖
implementation 'com.rxjava.rxhttp:rxhttp:1.0.9'
//注解处理器,生成RxHttp类,即可一条链发送请求
annotationProcessor 'com.rxjava.rxhttp:rxhttp-compiler:1.0.9'
注:RxHttp类是通过注解处理器自动生成的,故需要您在项目中使用一处注解,然后rebuild 一下项目,RxHttp即可以生成。注解使用,请查看RxHttp 一条链发送请求之注解处理器 Generated API(四)
三部曲解说
到这里相信很多人已经有疑问了
- 如果我想发送Post等其它方式请求呢?
- 文件上传下载及进度的监听呢?
- 我想得到自定义的数据类型呢?
这些如何通过三部曲实现呢?别着急,接下来一一为大家讲解
第一步,确定请求方式
上面例子中,我们调用了RxHttp.get("http://...")
语句,其中get
操作符就代码Get请求。由此,我们可以猜测,发送Post请求,只需要调用post
操作符即可。然而我们只猜对了一半,为啥这么说呢?Post请求中,我们常见的又分为两种,一种的表单形式的Post,另一种是Json字符串形式的Post。为此,RxHttp提供了两个发送Post请求的操作符,分别是postForm
和postJosn
,此时,我们就可以这样发送Post请求
RxHttp.postForm("http://...") //发送表单形式的Post请求
.asString() //返回String类型
.subscribe(s -> { //订阅观察者,
//请求成功
}, throwable -> {
//请求失败
});
RxHttp.postJson("http://...") //发送Json字符串单形式的Post请求
.asString() //返回String类型
.subscribe(s -> { //订阅观察者,
//请求成功
}, throwable -> {
//请求失败
});
如果想发送Delete、Put等其它方式的请求,同理,如下:
RxHttp.deleteForm("http://...")
RxHttp.deleteJson("http://...")
RxHttp.putForm("http://...")
RxHttp.putJson("http://...")
//其它请求方式同上
最后,我们来看下,RxHttp都提供了哪些请求方式,如下:
其中
get
、postForm
、postJson
上面已经讲过了,其它的同理,这里就不再讲述了。
请求方式确定了,如何添加参数或者头像信息呢?so easy!!!,只需调用add
、addHeader
即可,如下:
RxHttp.postForm("http://...") //发送表单形式的Post请求
.add("key","value") //添加请求参数,该方法可调用多次
.addHeader("headerKey","headerValue") //添加请求头参数,该方法可调用多次
.asString() //返回String类型
.subscribe(s -> { //订阅观察者,
//请求成功
}, throwable -> {
//请求失败
});
第二步,确定返回数据类型
上面的asString
操作符代表返回String字符串类型,RxHttp提供了17
个asXXX
操作符,如下:
其中,asBoolean、asInteger、asLong、asString等,我想很好理解,就是返回基本类型的装箱类型,这个不就过多讲解。这里我们重点看下
asObject
、asList
、asDownload
这3个操作符。
asObject
显示开发中,我们返回的更多是自定义的数据类型,比如我们想得到一个Student对象,此时,我们就可以用asObject
操作符,如下:
RxHttp.get("http://...") //发送Get请求
.asObject(Student.class) //指定返回User类型数据
.subscribe(student -> { //订阅观察者,
//请求成功,这里student就是Student对象
}, throwable -> {
//请求失败
});
asList
然而,如果我们想得到一系列Student对象呢?使用asObject显然行不通,此时就要用到asList
操作符了,如下:
RxHttp.get("http://...") //发送Get请求
.asList(Student.class) //指定返回User类型数据
.subscribe(students -> { //订阅观察者,
//请求成功,这里students就是List对象
}, throwable -> {
//请求失败
});
注:asXXX操作符,内部会默认指定请求在
Schedulers.io()
线程执行
asDownload
当我们需要下载文件,就用此操作符,如下:
RxHttp.get("http://...") //Get请求
.asDownload(".../rxhttp.apk") //使用asDownload操作符,并传入存储路径
.subscribe(s -> {
//下载成功回调,s为文件存储路径
}, (OnError) throwable -> {
//下载失败回调
});
更多文件操作,请查看Android 史上最优雅的实现文件上传、下载及进度的监听
第三步,订阅观察者
在上一步中,细心的你也许发现了,使用了asXXX
操作符后,会返回一个Observable
对象,那这个又是什么对象呢?其实它就是RxJava内部的Observable
对象。
在这,可以告诉你,当我们调用asXXX
操作符,拿到Observable
对象后,RxHttp就已经完成了它的使命,接下来的事情都丢给了RxJava。拿到Observable
对象,结合RxJava强大的操作符,我们可以做非常多的事情,比如我们想要在主线程回调观察者,如下:
RxHttp.get("http://...") //发送Get请求
.asList(Student.class) //指定返回User类型数据
.observeOn(AndroidSchedulers.mainThread()) //主线程回调观察者
.subscribe(students -> { //订阅观察者,
//请求成功,这里students就是List对象
}, throwable -> {
//请求失败
});
注:请求默认在Schedulers.io()线程执行,如未指定观察者所在线程,则默认在请求所在线程回调
小结
好了,请求三部曲就讲解结束,到这,你已经掌握了RxHttp 70% 的功能,并且掌握了RxHttp的精髓----请求三部曲,在任意请求中,就能做到以不变应万变。
本篇文章的目的在于提供一个简单的入门教程,更多功能请查看
RxHttp 一条链发送请求,新一代Http请求神器(一)
RxHttp 一条链发送请求之强大的数据解析功能(二)
RxHttp 一条链发送请求之强大的Param类(三)
RxHttp 一条链发送请求之注解处理器 Generated API(四)
Android 史上最优雅的实现文件上传、下载及进度的监听
问题简答
最后,借此机会,简单解答一下读者反馈的问题
1、RxHttp支持Https吗?
答:支持,RxHttp内置默认的OkHttpClient对象,如下:
new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.sslSocketFactory(sslSocketFactory, trustAllCert) //添加信任证书
.hostnameVerifier((hostname, session) -> true) //忽略host验证
.build();
2、RxHttp支持缓存处理吗?
答:支持,但是RxHttp默认没有做任何缓存处理,如有需要,请自定义OkHttpClient对象开启缓存,并使用RxHttp发送请求时,使用cacheControl(CacheControl cacheControl)
设置缓存策略
3、RxHttp如何支持session或者token?
答:session或者token涉及到具体的业务逻辑,故RxHttp暂时并没有做深度封装。如有需要,可自定义OkHttpClient对象通过拦截器去实现。
4、RxHttp支持kotlin吗?
答:必须支持,但是依赖注解处理器时,需要使用kapt代替annotationProcessor
5、RxHttp如何支持多任务列表下载
答:在最新的Demo中,已有案例,欢迎下载Demo体验
在使用过程中,如遇到什么问题,环境加群交流RxHttp&RxLife 交流群:378530627