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

开胃菜

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

RxHttp.get("http://...")  //第一步,确定请求类型,这里为Get请求           
    .asString()           //第二步,确定返回类型,这里返回String类型      
    .subscribe(s -> {     //第二步,订阅观察者,第二步返回Observable对象
        //请求成功                                         
    }, throwable -> {                                  
        //请求失败                                         
    });                                                

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

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

重要事情说3遍

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

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

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

gradle依赖

implementation 'com.rxjava.rxhttp:rxhttp:1.0.9'
//注解处理器,生成RxHttp类,即可一条链发送请求
annotationProcessor 'com.rxjava.rxhttp:rxhttp-compiler:1.0.9'

注:RxHttp类是通过注解处理器自动生成的,故需要您在项目中使用一处注解,然后rebuild 一下项目,RxHttp即可以生成。注解使用,请查看RxHttp 一条链发送请求之注解处理器 Generated API(四)

三部曲解说

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

  • 如果我想发送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都提供了哪些请求方式,如下:

image

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

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

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

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

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

image

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

asObject

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

RxHttp.get("http://...")       //发送Get请求         
    .asObject(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为文件存储路径                                   
     }, (OnError) 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 史上最优雅的实现文件上传、下载及进度的监听

问题简答

最后,借此机会,简单解答一下读者反馈的问题

1、RxHttp支持Https吗?

答:支持,RxHttp内置默认的OkHttpClient对象,如下:

new OkHttpClient.Builder()                                    
    .connectTimeout(10, TimeUnit.SECONDS)                     
    .readTimeout(10, TimeUnit.SECONDS)                        
    .writeTimeout(10, TimeUnit.SECONDS)                       
    .sslSocketFactory(sslSocketFactory, trustAllCert) //添加信任证书
    .hostnameVerifier((hostname, session) -> true) //忽略host验证 
    .build();                                                 

2、RxHttp支持缓存处理吗?

答:支持,但是RxHttp默认没有做任何缓存处理,如有需要,请自定义OkHttpClient对象开启缓存,并使用RxHttp发送请求时,使用cacheControl(CacheControl cacheControl)设置缓存策略

3、RxHttp如何支持session或者token?

答:session或者token涉及到具体的业务逻辑,故RxHttp暂时并没有做深度封装。如有需要,可自定义OkHttpClient对象通过拦截器去实现。

4、RxHttp支持kotlin吗?

答:必须支持,但是依赖注解处理器时,需要使用kapt代替annotationProcessor

5、RxHttp如何支持多任务列表下载

答:在最新的Demo中,已有案例,欢迎下载Demo体验

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,183评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,850评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,766评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,854评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,871评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,457评论 1 311
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,999评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,914评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,465评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,543评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,675评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,354评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,029评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,514评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,616评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,091评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,685评论 2 360