HttpSender
HttpSender 是对OkHttp二次封装,并与RxJava做到了无缝连接,支持任意Http请求方式,如:Get、Post、Head、Put等;也支持任意数据解析方法,如:Json、DOM解析等;并且可以很优雅的实现上传/下载进度的监听。
自问:目前已有Retrofit ,再结合RxJava,发送请求已经很方便,为啥还要自己去封装? 自答:Retrofit固然好用,但不是十分的好用,首先,有一定的学习成本;再一个,个人觉得Retrofit在便捷性、代码复用性上不是很友好,在看完本篇文章后,或许你会有同感。
本人是一个三流码农,如有不足之处,理解万岁!!!!!
HttpSender 开篇之功能使用篇,超好用、功能超级强大的Http请求框架
gradle依赖
implementation 'com.http.wrapper:httpsender:1.0.1'
复制代码
话不多说,开始,我们拿淘宝获取IP的接口作为测试接口
返回的数据格式如下:
{
"code": 0,
"data": { //在这,为了简单,在data下删除了部分字段,只保留3个字段
"country": "美国",
"region": "华盛顿",
"city": "西雅图"
}
}
复制代码
对应的Bean类
public class Response {
private int code;
private Address data;
//省略set、get方法
class Address {
private String country; //国家
private String region; //地区
private String city; //城市
//省略set、get方法
}
}
复制代码
发送Get请求
String url = "http://ip.taobao.com/service/getIpInfo.php";
Param param = Param.get(url) //这里get,代表Get请求
.add("ip", "63.223.108.42")//添加参数
.addHeader("accept", "*/*") //添加请求头
.addHeader("connection", "Keep-Alive")
.addHeader("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
Disposable disposable = HttpSender
//SimpleParser是一个数据解析器,后续会有介绍,它需要传入一个泛型,此泛型决定Http的返回类型
.from(param, new SimpleParser<Response>() {}) //from操作符,是异步操作
.observeOn(AndroidSchedulers.mainThread()) //主线程回调
.subscribe(new Consumer<Response>() {
@Override
public void accept(Response response) throws Exception {
//accept方法参数类型由上面SimpleParser传入的泛型类型决定
//走到这里说明Http请求成功,并且数据正确
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
//Http请求出现异常,有可能是网络异常,数据异常等
}
});
复制代码
发送Post请求
String url = "http://ip.taobao.com/service/getIpInfo.php";
Param param = Param.postForm(url) //发送Form表单形式的Post请求
.add("ip", "63.223.108.42")//添加参数
.addHeader("accept", "*/*") //添加请求头
.addHeader("connection", "Keep-Alive")
.addHeader("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
Disposable disposable = HttpSender
//SimpleParser是一个数据解析器,后续会有介绍,它需要传入一个泛型,此泛型决定Http的返回类型
.from(param, new SimpleParser<Response>() {}) //from操作符,是异步操作
.observeOn(AndroidSchedulers.mainThread()) //主线程回调
.subscribe(new Consumer<Response>() {
@Override
public void accept(Response response) throws Exception {
//accept方法参数类型由上面SimpleParser传入的泛型类型决定
//走到这里说明Http请求成功,并且数据正确
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
//Http请求出现异常,有可能是网络异常,数据异常等
}
});
复制代码
到这你会发现,Get跟Post请求仅仅是获取Param对象的时候不一样,即Param.get()和Param.postForm(),后续会对Param详细介绍。
也许有人会说,发送一个请求要写那么多的代码,太麻烦,不好用,我想说的是,以上案例是一个比较完整的请求流程,有带参数、请求头,又对返回数据做了自动解析,如果没有这些,再结合Java 8 的Lambda表达式,你会发现,一切都是那么的优雅 注:以下代码展示均结合Lambda表达式,不懂的同学去了解一下
String url = "http://www.baidu.com";
Disposable disposable = HttpSender
.fromGet(url) //fromGet异步操作符,Get请求,内部调用了from(Param,Parser)方法
.observeOn(AndroidSchedulers.mainThread()) //主线程回调
.subscribe(s -> {
//Http请求成功
}, throwable -> {
//Http请求出现异常
});
复制代码
怎么样,是不是很简单,一条线下来,代码简洁,逻辑清晰 接下来,我们试试文件上传,直接上代码
String url = "http://www.......";
Param param = Param.postForm(url) //发送Form表单形式的Post请求
.add("file1", new File("xxx/1.png"))
.add("file2", new File("xxx/2.png"))
.add("key1", "value1")//添加参数,非必须
.add("key2", "value2")//添加参数,非必须
.addHeader("versionCode", "100"); //添加请求头,非必须
Disposable disposable = HttpSender
.from(param, new SimpleParser<String>() {}) //from操作符,是异步操作
.observeOn(AndroidSchedulers.mainThread()) //主线程回调
.subscribe(s -> { //s为String类型,由SimpleParser类里面的泛型决定的
//Http请求成功
}, throwable -> {
//Http请求出现异常
});
复制代码
看完你会发现,其实没什么,无非就拿到Param对象调用add方法传入文件,然后调用HttpSender发送出去就ok了。
如果要监听上传进度呢?so easy!!!
String url = "http://www.......";
Param param = Param.postForm(url) //发送Form表单形式的Post请求
.add("file1", new File("xxx/1.png"))
.add("file2", new File("xxx/2.png"))
.add("key1", "value1")//添加参数,非必须
.add("key2", "value2")//添加参数,非必须
.addHeader("versionCode", "100"); //添加请求头,非必须
Disposable disposable = HttpSender
.upload(param, new SimpleParser<String>() {}) //注:如果需要监听上传进度,使用upload操作符
.observeOn(AndroidSchedulers.mainThread()) //主线程回调
.doOnNext(progress -> {
//上传进度回调,0-100,仅在进度有更新时才会回调
int currentProgress = progress.getProgress(); //当前进度 0-100
long currentSize = progress.getCurrentSize(); //当前已上传的字节大小
long totalSize = progress.getTotalSize(); //要上传的总字节大小
})
.filter(Progress::isCompleted)//过滤事件,上传完成,才继续往下走
.map(Progress::getResult) //到这,说明上传完成,拿到Http返回结果并继续往下走
.subscribe(s -> { //s为String类型,由SimpleParser类里面的泛型决定的
//上传成功,处理相关逻辑
}, throwable -> {
//上传失败,处理相关逻辑
});
复制代码
有上传,那肯定就有下载,而且还是带进度回调的
String url = "http://update.9158.com/miaolive/Miaolive.apk";
//文件存储路径
String destPath = getExternalCacheDir() + "/" + System.currentTimeMillis() + ".apk";
Disposable disposable = HttpSender
.download(Param.get(url), destPath) //注意这里使用download操作符
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(progress -> {
//下载进度回调,0-100,仅在进度有更新时才会回调
int currentProgress = progress.getProgress(); //当前进度 0-100
long currentSize = progress.getCurrentSize(); //当前已下载的字节大小
long totalSize = progress.getTotalSize(); //要下载的总字节大小
})
.filter(Progress::isCompleted)//下载完成,才继续往下走
.map(Progress::getResult) //到这,说明下载完成,返回下载目标路径
.subscribe(s -> {//s为String类型
//下载完成,处理相关逻辑
}, throwable -> {
//下载失败,处理相关逻辑
});
复制代码
怎么样,是不是跟监听上传进度的代码差不多?这个就是与RxJava结合的好处。
如果我们不想监听下载进度,更简单,使用DownloadParser解析器
String url = "http://update.9158.com/miaolive/Miaolive.apk";
//文件存储路径
String destPath = getExternalCacheDir() + "/" + System.currentTimeMillis() + ".apk";
Disposable disposable = HttpSender
.from(Param.get(url), new DownloadParser(destPath)) //注意这里使用DownloadParser解析器,并传入本地路径
.observeOn(AndroidSchedulers.mainThread())
.subscribe(s -> {
//下载成功,处理相关逻辑
}, throwable -> {
//下载失败,处理相关逻辑
});
复制代码
小结: 怎么样?看完是不是觉得很简单,发送请求三部曲:
- 选择合适的Http请求方式,调用Param的get、head、postForm、postJson、putForm等一系列静态方法创建Param对象,随后就可添加相关参数信息,后续会详细介绍Param
- 选择合适的解析器Parser,目前已经实现了StringParser、SimpleParser、DownloadParser,后面会详细介绍,可结合自身业务需求扩展Parser对象;
- 调用HttpSender类的fromGet、from、upload、download等操作符传入Param和Parser对象即可,剩下的就交给RxJava处理了
注:fromGet和download操作符内部也使用了Param和Parser对象,只是做了一层封装而已
到这你以为就结束了吗?远远没有,HttpSender更强大的是它的高扩展性,例如Param和Parser,后面会写单独的文章来介绍