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

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

内容简介: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 -> {
            //上传失败,处理相关逻辑
        });
复制代码

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

查看所有标签

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

Iterative Methods for Sparse Linear Systems, Second Edition

Iterative Methods for Sparse Linear Systems, Second Edition

Yousef Saad / Society for Industrial and Applied Mathematics / 2003-04-30 / USD 102.00

Tremendous progress has been made in the scientific and engineering disciplines regarding the use of iterative methods for linear systems. The size and complexity of linear and nonlinear systems arisi......一起来看看 《Iterative Methods for Sparse Linear Systems, Second Edition》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换