当前位置: 首页 > 工具软件 > httpsender > 使用案例 >

HttpSender OkHttp+RxJava超好用、功能超级强大的Http请求框架

沈国安
2023-12-01

HttpSender

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

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

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

HttpSender 开篇之功能使用篇,超好用、功能超级强大的Http请求框架

HttpSender 介绍篇之生命周期、公共参数相关配置

HttpSender 介绍篇之Parser介绍

HttpSender 介绍篇之Param介绍

HttpSender 扩展篇之Parser扩展

gradle依赖

implementation 'com.http.wrapper:httpsender:1.0.1'
复制代码

话不多说,开始,我们拿淘宝获取IP的接口作为测试接口

ip.taobao.com/service/get…

返回的数据格式如下:

{
    "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 -> {
            //下载失败,处理相关逻辑
        });
复制代码

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

  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,后面会写单独的文章来介绍

 类似资料: