22

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

 4 years ago
source link: https://juejin.im/post/5cfcbbcbe51d455a694f94df
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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

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

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

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

1

重要事情说3遍

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

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

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

gradle依赖

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

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

//使用kapt依赖rxhttp-compiler,需要导入kapt插件
apply plugin: 'kotlin-kapt'

android {
    defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [
                    //必须,告知RxHttp你依赖的okhttp版本,目前已适配 v3.12.0 - v4.7.2版本
                    rxhttp_okhttp: '4.7.2',
                    //使用asXxx方法时必须,告知RxHttp你依赖的rxjava版本,可传入rxjava2、rxjava3
                    rxhttp_rxjava: 'rxjava3', 
                    rxhttp_package: 'rxhttp'   //非必须,指定RxHttp相关类的生成路径,即包名
                ]
            }
        }
    }
    //必须,java 8或更高
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
dependencies {
    //以下3个为必须,
    implementation 'com.ljx.rxhttp:rxhttp:2.2.7'
    implementation 'com.squareup.okhttp3:okhttp:4.7.2' //rxhttp v2.2.2版本起,需要手动依赖okhttp
    kapt 'com.ljx.rxhttp:rxhttp-compiler:2.2.7' //生成RxHttp类,非kotlin项目,请使用annotationProcessor代替kapt
    
    implementation 'com.ljx.rxlife:rxlife-coroutine:2.0.0' //管理协程生命周期,页面销毁,关闭请求
    
    //rxjava2   (RxJava2/Rxjava3二选一,使用asXxx方法时必须)
    implementation 'io.reactivex.rxjava2:rxjava:2.2.8'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
    implementation 'com.ljx.rxlife2:rxlife-rxjava:2.0.0' //管理RxJava2生命周期,页面销毁,关闭请求

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

    //非必须,根据自己需求选择 RxHttp默认内置了GsonConverter
    implementation 'com.ljx.rxhttp:converter-jackson:2.2.7'
    implementation 'com.ljx.rxhttp:converter-fastjson:2.2.7'
    implementation 'com.ljx.rxhttp:converter-protobuf:2.2.7'
    implementation 'com.ljx.rxhttp:converter-simplexml:2.2.7'
}
复制代码

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

三部曲解说

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

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

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

第一步,确定请求方式

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

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

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

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

最后,我们来看下,RxHttp都提供了哪些请求方式,如下:

1
其中getpostFormpostJson上面已经讲过了,其它的同理,这里就不再讲述了。

请求方式确定了,如何添加参数或者头像信息呢?so easy!!!,只需调用addaddHeader即可,如下:

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

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

上面的asString操作符代表返回String字符串类型,RxHttp提供了一系列asXXX操作符,如下:

1
其中,asBoolean、asInteger、asLong、asString等,很好理解,就是返回基本类型的装箱类型,。这个不就过多讲解。这里我们重点看下asObjectasListasDownload这3个操作符。

asClass

显示开发中,我们返回的更多是自定义的数据类型,比如我们想得到一个Student对象,此时,我们就可以用asClass操作符,如下:

RxHttp.get("http://...")       //发送Get请求         
    .asClass(Student.class)   //指定返回User类型数据 
    .subscribe(student -> {    //订阅观察者,
        //请求成功,这里student就是Student对象                                         
    }, throwable -> {                                  
        //请求失败                                         
    });  
复制代码

asList

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

RxHttp.get("http://...")        //发送Get请求         
    .asList(Student.class)      //指定返回User类型数据 
    .subscribe(students -> {    //订阅观察者,
        //请求成功,这里students就是List<Student>对象                                         
    }, throwable -> {                                  
        //请求失败                                         
    });  
复制代码

注:asXXX操作符,内部会默认指定请求在Schedulers.io()线程执行

asDownload

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

 RxHttp.get("http://...")        //Get请求                         
     .asDownload(".../rxhttp.apk")  //使用asDownload操作符,并传入存储路径
     .subscribe(s -> {                                       
         //下载成功回调,s为文件存储路径                                   
     }, throwable -> {                             
         //下载失败回调                                            
     });                                                     
复制代码

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

第三步,订阅观察者

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

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

RxHttp.get("http://...")        //发送Get请求         
    .asList(Student.class)      //指定返回User类型数据 
    .observeOn(AndroidSchedulers.mainThread())  //主线程回调观察者
    .subscribe(students -> {    //订阅观察者,
        //请求成功,这里students就是List<Student>对象                                         
    }, throwable -> {                                  
        //请求失败                                         
    });  
复制代码

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

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

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

RxHttp 一条链发送请求之强大的数据解析功能(二)

RxHttp 一条链发送请求之强大的Param类(三)

RxHttp 一条链发送请求之注解处理器 Generated API(四)

Android 史上最优雅的实现文件上传、下载及进度的监听

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK