RxHttp 一条链发送请求,新一代Http请求神器(一)

栏目: IOS · Android · 发布时间: 5年前

内容简介:RxHttp是基于OkHttp的二次封装,并于RxJava做到无缝衔接,一条链就能发送一个完整的请求。主要功能如下:RxHttp共有8篇文章

RxHttp是基于OkHttp的二次封装,并于RxJava做到无缝衔接,一条链就能发送一个完整的请求。主要功能如下:

  • 支持Get、Post、Put、Delete等任意请求方式,可自定义请求方式
  • 支持Json、DOM等任意数据解析方法,可自定义数据解析器
  • 支持文件下载/上传,及进度的监听,并且支持断点下载
  • 支持在Activity/Fragment的任意生命周期方法,自动关闭未完成的请求
  • 支持添加公共参数/头部信息,且可动态更改baseUrl
  • 支持请求串行和并行

gradle依赖

implementation 'com.rxjava.rxhttp:rxhttp:1.0.0'
//注解处理器,生成RxHttp类,即可一条链发送请求
annotationProcessor 'com.rxjava.rxhttp:rxhttp-compiler:1.0.0'
//管理RxJava及生命周期,Activity/Fragment 销毁,自动关闭未完成的请求
implementation 'com.rxjava.rxlife:rxlife:1.0.4'
复制代码

RxHttp 源码 RxLife 源码

RxHttp共有8篇文章

RxHttp 一条链发送请求,新一代Http请求神器(一)

RxHttp 介绍篇之生命周期、公共参数相关配置(二)

RxHttp 介绍篇之Parser介绍(三)

RxHttp 介绍篇之Param介绍(四)

RxHttp 介绍篇之多请求串行与并行(五)

RxHttp 扩展篇之Parser扩展(六)

RxHttp 扩展篇之Param扩展(七)

RxHttp 扩展篇之注解处理器 Generated API(八)

ok,咱们正式开始,我们先来看看,一个功能相对齐全的Http请求如何操作

功能相对齐全的Http请求

RxHttp.postForm("http://...") //传入url,确定请求方式  这里postForm代表发送表单形式的Post请求
        .setUrl("http://")    //重新设置url
        .setAssemblyEnabled(false)  //设置是否添加公共参数,默认为true
        .add("key", "value")  //添加请求参数,可添加n个
        .add("key1", "value1") 
        .add("file1", new File("xxx/1.png")) //添加文件,可添加n个
        .add("file2", new File("xxx/2.png"))
        .addHeader("headerKey", "HeaderValue") //添加头部信息,可添加n个
        .addHeader("headerKey1", "HeaderValue1")
        //使用SimpleParser解析器,将数据解析成指定对象,这里解析成Integer对象
        .fromSimpleParser(Integer.class)   
        //感知Activity/Fragment 生命周期,页面销毁时,自动关闭请求
        .as(RxLife.asOnMain(this)) 
        .subscribe(i -> {  //订阅观察者,开始发送请求  这里i为Integer类型
            //成功回调
        }, throwable -> {
            //失败回调
        });
复制代码

注: 对RxLife不了解的同学,请查看 Android RxLife 一款轻量级别的RxJava生命周期管理库 (二)

可以看到,一条链就能完成一个完整的Http请求,简单一点,就是请求三部曲:

  • 首先,确定请求方式并添加相关参数
  • 然后,确定解析器,指定要解析成的类型
  • 最后,订阅观察者,开始发送请求

我们用请求三部曲的思想来看看,如何发送一个最简单的请求

RxHttp.get("http://...")                //第一步,确定请求方式
        .fromSimpleParser(String.class) //  第二步,确定解析器
        .subscribe(s -> {               //第三部  订阅观察者
            //成功回调
        }, throwable -> {
            //失败回调
        });
复制代码

怎么样,是不是so easy!!!!

ok,下面我们进入真实案例,我们拿淘宝获取IP的接口作为测试接口 http://ip.taobao.com/service/getIpInfo.php?ip=63.223.108.42 对应的数据结构如下

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请求

RxHttp.get("http://ip.taobao.com/service/getIpInfo.php") //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)")
        .fromSimpleParser(Response.class)  //这里返回Observable<Response> 对象
        .as(RxLife.asOnMain(this))  //感知生命周期,并在主线程回调
        .subscribe(response -> {
            //成功回调
        }, throwable -> {
            //失败回调
        });
复制代码

Post请求

RxHttp.postForm("http://ip.taobao.com/service/getIpInfo.php")
        .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)")
        .fromSimpleParser(Response.class)  //这里返回Observable<Response>对象
        .as(RxLife.asOnMain(this))  //感知生命周期,并在主线程回调
        .subscribe(response -> {
            //成功回调
        }, throwable -> {
            //失败回调
        });
复制代码

可以发现,在这里Get跟Post请求代码几乎一样,只有第一行代码不同。

文件上传

RxHttp.postForm("http://...") //发送Form表单形式的Post请求
        .add("file1", new File("xxx/1.png"))
        .add("file2", new File("xxx/2.png"))
        .fromSimpleParser(String.class) //from操作符,是异步操作
        .as(RxLife.asOnMain(this))  //感知生命周期,并在主线程回调
        .subscribe(s -> { 
            //成功回调
        }, throwable -> {
            //失败回调
        });
复制代码

文件下载

//文件存储路径
String destPath = getExternalCacheDir() + "/" + System.currentTimeMillis() + ".apk";
RxHttp.get("http://update.9158.com/miaolive/Miaolive.apk")
        .from(new DownloadParser(destPath)) //注意这里使用DownloadParser解析器,并传入本地路径
        .as(RxLife.asOnMain(this))  //感知生命周期,并在主线程回调
        .subscribe(s -> {
            //下载成功,回调文件下载路径
        }, throwable -> {
            //下载失败
        });
复制代码

文件下载进度监听

//文件存储路径
String destPath = getExternalCacheDir() + "/" + System.currentTimeMillis() + ".apk";
RxHttp.get("http://update.9158.com/miaolive/Miaolive.apk")
        .download(destPath) //注:如果需要监听下载进度,使用download操作符
        .observeOn(AndroidSchedulers.mainThread())
        .doOnNext(progress -> {
            //下载进度回调,0-100,仅在进度有更新时才会回调,最多回调101次,最后一次回调文件存储路径
            int currentProgress = progress.getProgress(); //当前进度 0-100
            long currentSize = progress.getCurrentSize(); //当前已下载的字节大小
            long totalSize = progress.getTotalSize();     //要下载的总字节大小
            String filePath = progress.getResult(); //文件存储路径,最后一次回调才有内容
        })
        .filter(Progress::isCompleted)//下载完成,才继续往下走
        .map(Progress::getResult) //到这,说明下载完成,返回下载目标路径
        .as(RxLife.as(this)) //感知生命周期
        .subscribe(s -> {//s为String类型,这里为文件存储路径
            //下载完成,处理相关逻辑
        }, throwable -> {
            //下载失败,处理相关逻辑
        });
复制代码

文件上传进度监听

RxHttp.postForm("http://www.......") //发送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") //添加请求头,非必须
        .upload(SimpleParser.get(String.class)) //注:如果需要监听上传进度,使用upload操作符
        .observeOn(AndroidSchedulers.mainThread()) //主线程回调
        .doOnNext(progress -> {
            //上传进度回调,0-100,仅在进度有更新时才会回调,最多回调101次,最后一次回调Http执行结果
            int currentProgress = progress.getProgress(); //当前进度 0-100
            long currentSize = progress.getCurrentSize(); //当前已上传的字节大小
            long totalSize = progress.getTotalSize();     //要上传的总字节大小
            String result = progress.getResult(); //Http执行结果,最后一次回调才有内容
        })
        .filter(Progress::isCompleted)//过滤事件,上传完成,才继续往下走
        .map(Progress::getResult) //到这,说明上传完成,拿到Http返回结果并继续往下走
        .as(RxLife.as(this))  //感知生命周期
        .subscribe(s -> { //s为String类型,由SimpleParser类里面的泛型决定的
            //上传成功,处理相关逻辑
        }, throwable -> {
            //上传失败,处理相关逻辑
        });
复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

连线

连线

加里·沃尔夫 / 黄锫坚 / 中国铁道出版社 / 2006-7 / 29.80元

简言之,是一个人和一本杂志的传奇……   放在大环境中,是一个时代的跌宕起伏……   一直大力地向所有人推荐这本书,只是因为,故事真的很精彩,是一个伟大而疯狂的时代所造就的一个不屈不挠的斗士——路易斯·罗塞托,还有这本举世皆知的杂志——《连线》。   通过本书,中国读者会知道,新经济热潮的主角不仅是比尔·盖茨、杨致远等技术和商业能人,还有一大批新文化的传教士和吹鼓手,比如路易斯·......一起来看看 《连线》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具