博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HttpSender OkHttp+RxJava超好用、功能超级强大的Http请求框架
阅读量:6331 次
发布时间:2019-06-22

本文共 6952 字,大约阅读时间需要 23 分钟。

HttpSender

HttpSender 是对OkHttp二次封装,并与RxJava做到了无缝连接,支持任意Http请求方式,如:Get、Post、Head、Put等;也支持任意数据解析方法,如:Json、DOM解析等;并且可以很优雅的实现上传/下载进度的监听。

自问:目前已有Retrofit ,再结合RxJava,发送请求已经很方便,为啥还要自己去封装? 自答:Retrofit固然好用,但不是十分的好用,首先,有一定的学习成本;再一个,个人觉得Retrofit在便捷性、代码复用性上不是很友好,在看完本篇文章后,或许你会有同感。

本人是一个三流码农,如有不足之处,理解万岁!!!!!

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
() {}) //from操作符,是异步操作 .observeOn(AndroidSchedulers.mainThread()) //主线程回调 .subscribe(new Consumer
() { @Override public void accept(Response response) throws Exception { //accept方法参数类型由上面SimpleParser传入的泛型类型决定 //走到这里说明Http请求成功,并且数据正确 } }, new Consumer
() { @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
() {}) //from操作符,是异步操作 .observeOn(AndroidSchedulers.mainThread()) //主线程回调 .subscribe(new Consumer
() { @Override public void accept(Response response) throws Exception { //accept方法参数类型由上面SimpleParser传入的泛型类型决定 //走到这里说明Http请求成功,并且数据正确 } }, new Consumer
() { @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
() {}) //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
() {}) //注:如果需要监听上传进度,使用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 -> {            //下载失败,处理相关逻辑        });复制代码

小结: 怎么样?看完是不是觉得很简单,发送请求三部曲:

  1. 选择合适的Http请求方式,调用Param的get、head、postForm、postJson、putForm等一系列静态方法创建Param对象,随后就可添加相关参数信息,后续会详细介绍Param
  2. 选择合适的解析器Parser,目前已经实现了StringParser、SimpleParser、DownloadParser,后面会详细介绍,可结合自身业务需求扩展Parser对象;
  3. 调用HttpSender类的fromGet、from、upload、download等操作符传入Param和Parser对象即可,剩下的就交给RxJava处理了

注:fromGet和download操作符内部也使用了Param和Parser对象,只是做了一层封装而已

到这你以为就结束了吗?远远没有,HttpSender更强大的是它的高扩展性,例如Param和Parser,后面会写单独的文章来介绍

转载地址:http://okboa.baihongyu.com/

你可能感兴趣的文章
Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析(2)
查看>>
Lync 小技巧-5-当前已暂停共享
查看>>
无线802.11n 2.4G与5G性能测试
查看>>
子域名信息收集攻略
查看>>
[Android]开发数独游戏思路分析过程
查看>>
SpreadJS 类Excel表格控件 - V12 新特性详解
查看>>
理解并取证:IPv6与IPv4在报文结构上的区别
查看>>
EOS主网上线只是开始,如何运营决定未来
查看>>
不用Visual Studio,5分钟轻松实现一张报表
查看>>
(译)如何使用cocos2d和box2d来制作一个Breakout游戏:第一部分
查看>>
计算机图形学(一) 图形系统综述
查看>>
持续集成(CI)- 几种测试的区别(摘录)
查看>>
多用户虚拟Web3D环境Deep MatrixIP9 1.04发布
查看>>
求高手,求解释
查看>>
[MSSQL]NTILE另类分页有么有?!
查看>>
winform datagridview 通过弹出小窗口来隐藏列 和冻结窗口
查看>>
Jquery闪烁提示特效
查看>>
最佳6款用于移动网站开发的 jQuery 图片滑块插件
查看>>
C++ String
查看>>
获取系统托盘图标的坐标及文本
查看>>