30秒上手新一代Http请求神器RxHttp

25,699 阅读6分钟

开胃菜

话不多说,30s倒计时开始,先来看看如何发送一个Get请求,如下:

RxHttp.get("http://...")  //第一步,确定请求类型,可以选择postForm、postJson等方法 
    .toObervableString()  //第二步,确定返回类型,这里返回String类型      
    .subscribe(s -> {     //第三步,订阅观察者,第二步返回Observable对象
        //请求成功                                         
    }, throwable -> {                                  
        //请求失败                                         
    });                                                

Ok,倒计时结束!!! 到这,你已经学会了RxHttp的精髓。

是的,不用怀疑,就是这么简单,使用RxHttp,任意请求,任意返回数据类型,都遵循这三个步骤,我们称之为请求三部曲,如下:

image.png

重要事情说3遍

任意请求,任意返回数据类型,皆遵循请求三部曲

任意请求,任意返回数据类型,皆遵循请求三部曲

任意请求,任意返回数据类型,皆遵循请求三部曲

gradle依赖

  • OkHttp 3.14.x以上版本, 最低要求为API 21,如你想要兼容21以下,请依赖OkHttp 3.12.x,该版本最低要求 API 9

  • toObverableXxx方法内部是通过RxJava实现的,而RxHttp 2.2.0版本起,内部已剔除RxJava,如需使用,请自行依赖RxJava并告知RxHttp依赖的Rxjava版本

1、必选

jitpack添加到项目的build.gradle文件中,如下:

allprojects {
    repositories {
        maven { url "https://jitpack.io" }
    }
}

注:RxHttp 2.6.0版本起,已全面从JCenter迁移至jitpack

//使用kapt依赖rxhttp-compiler时必须
apply plugin: 'kotlin-kapt'

android {
    //必须,java 8或更高
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    def rxhttp_version = '3.2.7'
    implementation 'com.squareup.okhttp3:okhttp:4.11.0' 
    implementation "com.github.liujingxing.rxhttp:rxhttp:$rxhttp_version"
    kapt "com.github.liujingxing.rxhttp:rxhttp-compiler:$rxhttp_version" //生成RxHttp类,纯Java项目,请使用annotationProcessor代替kapt
 }

2、可选

android {
    kapt {
        arguments {
            //依赖了RxJava时,rxhttp_rxjava参数为必须,传入RxJava版本号
            arg("rxhttp_rxjava", "3.1.6")  
            arg("rxhttp_package", "rxhttp")  //指定RxHttp类包名,非必须
        }
    }
    //如果项目未集成kotlin,通过javaCompileOptions方法传参,在defaultConfig标签下
    annotationProcessorOptions {
        arguments = [
            rxhttp_rxjava: '3.1.6',
            rxhttp_package: 'rxhttp'
        ]
    }
}
dependencies {
    implementation 'com.github.liujingxing.rxlife:rxlife-coroutine:2.1.0' //管理协程生命周期,页面销毁,关闭请求
    
    //rxjava2   (RxJava2/Rxjava3二选一,使用asXxx方法时必须)
    implementation 'io.reactivex.rxjava2:rxjava:2.2.8'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
    implementation 'com.github.liujingxing.rxlife:rxlife-rxjava2:2.2.2' //管理RxJava2生命周期,页面销毁,关闭请求

    //rxjava3
    implementation 'io.reactivex.rxjava3:rxjava:3.1.6'
    implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
    implementation 'com.github.liujingxing.rxlife:rxlife-rxjava3:2.2.2' //管理RxJava3生命周期,页面销毁,关闭请求

    //非必须,根据自己需求选择 RxHttp默认内置了GsonConverter
    implementation "com.github.liujingxing.rxhttp:converter-fastjson:$rxhttp_version"
    implementation "com.github.liujingxing.rxhttp:converter-jackson:$rxhttp_version"
    implementation "com.github.liujingxing.rxhttp:converter-moshi:$rxhttp_version"
    implementation "com.github.liujingxing.rxhttp:converter-protobuf:$rxhttp_version"
    implementation "com.github.liujingxing.rxhttp:converter-simplexml:$rxhttp_version"
}

最后,rebuild一下(此步骤是必须的) ,就会自动生成RxHttp类

三部曲解说

到这里相信很多人已经有疑问了

  • 如果我想发送Post等其它方式请求呢?
  • 文件上传下载及进度的监听呢?
  • 我想得到自定义的数据类型呢?

这些如何通过三部曲实现呢?别着急,接下来一一为大家讲解

第一步,确定请求方式

上面例子中,我们调用了RxHttp.get("http://...")语句,其中get操作符就代表Get请求。由此,我们可以猜测,发送Post请求,只需要调用post操作符即可。然而我们只猜对了一半,为啥这么说呢?Post请求中,我们常见的又分为两种,一种的表单形式的Post,另一种是Json字符串形式的Post。为此,RxHttp提供了两个发送Post请求的操作符,分别是postFormpostJosn,此时,我们就可以这样发送Post请求

RxHttp.postForm("http://...")  //发送表单形式的Post请求           
    .toObservableString()                //返回String类型      
    .subscribe(s -> {          //订阅观察者,
        //请求成功                                         
    }, throwable -> {                                  
        //请求失败                                         
    });  
    
RxHttp.postJson("http://...")  //发送Json字符串单形式的Post请求           
    .toObservableString()                //返回String类型      
    .subscribe(s -> {          //订阅观察者,
        //请求成功                                         
    }, throwable -> {                                  
        //请求失败                                         
    });    

如果想发送Delete、Put等其它方式的请求,同理,如下:

RxHttp.deleteForm("http://...")
RxHttp.deleteJson("http://...")
RxHttp.putForm("http://...")
RxHttp.putJson("http://...")
//其它请求方式同上

请求方式确定后,便可通过addaddHeader方法添加请求参数及请求头,如下:

RxHttp.postForm("http://...")  //发送表单形式的Post请求     
    .add("key", "value")        //添加请求参数,该方法可调用多次                 
    .addHeader("headerKey", "headerValue")  //添加请求头参数,该方法可调用多次 
    .toObservableString()                //返回String类型      
    .subscribe(s -> {          //订阅观察者,
        //请求成功                                         
    }, throwable -> {                                  
        //请求失败                                         
    }); 

第二步,确定返回数据类型

上面的toObservableString操作符代表返回String字符串类型,RxHttp提供了一系列toObservableXxx操作符,其中最常用的应该就是toObservable(Class<T>),通过该方法传入具体的实体类,内部便会自动转换,如下

toObservable

通过toObservable方法得到一个Student对象,如下:

RxHttp.get("http://...")       //发送Get请求         
    .toObservable(Student.class)   //指定返回Student类型数据,对于kotlin,可直接toObservable<Student>()
    .subscribe(student -> {    //订阅观察者,
        //请求成功,这里student就是Student对象                                         
    }, throwable -> {                                  
        //请求失败                                         
    });  

toObservableList

然而,如果我们想得到一系列Student对象呢?使用asClass显然行不通,此时就要用到toObservableList操作符了,如下:

RxHttp.get("http://...")        //发送Get请求         
    .toObservableList(Student.class)      //指定List<Student>数据结构,对于kotlin,可直接toObservableList<Student>()
    .subscribe(students -> {    //订阅观察者,
        //请求成功,这里students就是List<Student>对象                                         
    }, throwable -> {                                  
        //请求失败                                         
    });  

toDownloadObservable

当我们需要下载文件,就用此操作符,如下:

 RxHttp.get("http://...")        //Get请求                         
     .toDownloadObservable(".../rxhttp.apk")  //传入本地存储路径
     .subscribe(s -> {                                       
         //下载成功回调,s为文件存储路径                                   
     }, throwable -> {                             
         //下载失败回调                                            
     });                                                     

更多文件操作,请查看Android 史上最优雅的实现文件上传、下载及进度的监听

第三步,订阅观察者

在上一步中,细心的你也许发现了,使用了toObservableXxx操作符后,会返回一个Observable对象,那这个又是什么对象呢?其实它就是RxJava内部的Observable对象。

在这,可以告诉你,当我们调用toObservableXxx操作符,拿到Observable对象后,RxHttp就已经完成了它的使命,接下来的事情都丢给了RxJava。拿到Observable对象,结合RxJava强大的操作符,我们可以做非常多的事情,比如我们想要在主线程回调观察者,如下:

RxHttp.get("http://...")        
    .toObservableList(Student.class)      
    .observeOn(AndroidSchedulers.mainThread())  //主线程回调观察者
    .subscribe(students -> {    //订阅观察者,
        //请求成功,这里students就是List<Student>对象                                         
    }, throwable -> {                                  
        //请求失败                                         
    });  

注:请求默认在Schedulers.io()线程执行,如未指定观察者所在线程,则默认在请求所在线程回调

小结

好了,请求三部曲就讲解结束,到这,你已经掌握了RxHttp 70% 的功能,并且掌握了RxHttp的精髓----请求三部曲,在任意请求中,就能做到以不变应万变。 本篇文章的目的在于提供一个简单的入门教程,更多功能请查看

RxHttp 让你眼前一亮的Http请求框架

RxHttp + Flow 三步搞定任意请求

RxHttp ,比Retrofit 更优雅的协程体验

RxHttp 完美适配Android 10/11 上传/下载/进度监听

RxHttp 全网Http缓存最优解

在使用过程中,如遇到什么问题,环境加群交流RxHttp&RxLife 交流群:378530627