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

開胃菜

話不多說,30s倒計時開始,先來看看如何發(fā)送一個Get請求,如下:

RxHttp.get("http://...")  //第一步,確定請求類型,這里為Get請求           
    .asString()           //第二步,確定返回類型,這里返回String類型      
    .subscribe(s -> {     //第二步,訂閱觀察者,第二步返回Observable對象
        //請求成功                                         
    }, throwable -> {                                  
        //請求失敗                                         
    });                                                

Ok,倒計時結(jié)束!??! 到這,你已經(jīng)學(xué)會了RxHttp的精髓。

是的,不用懷疑,就是這么簡單,使用RxHttp,任意請求,任意返回數(shù)據(jù)類型,都遵循這三個步驟,我們稱之為請求三部曲。

重要事情說3遍

任意請求,任意返回數(shù)據(jù)類型,皆遵循請求三部曲

任意請求,任意返回數(shù)據(jù)類型,皆遵循請求三部曲

任意請求,任意返回數(shù)據(jù)類型,皆遵循請求三部曲

gradle依賴

implementation 'com.rxjava.rxhttp:rxhttp:1.0.9'
//注解處理器,生成RxHttp類,即可一條鏈發(fā)送請求
annotationProcessor 'com.rxjava.rxhttp:rxhttp-compiler:1.0.9'

注:RxHttp類是通過注解處理器自動生成的,故需要您在項目中使用一處注解,然后rebuild 一下項目,RxHttp即可以生成。注解使用,請查看RxHttp 一條鏈發(fā)送請求之注解處理器 Generated API(四)

三部曲解說

到這里相信很多人已經(jīng)有疑問了

  • 如果我想發(fā)送Post等其它方式請求呢?
  • 文件上傳下載及進(jìn)度的監(jiān)聽呢?
  • 我想得到自定義的數(shù)據(jù)類型呢?

這些如何通過三部曲實現(xiàn)呢?別著急,接下來一一為大家講解

第一步,確定請求方式

上面例子中,我們調(diào)用了RxHttp.get("http://...")語句,其中get操作符就代碼Get請求。由此,我們可以猜測,發(fā)送Post請求,只需要調(diào)用post操作符即可。然而我們只猜對了一半,為啥這么說呢?Post請求中,我們常見的又分為兩種,一種的表單形式的Post,另一種是Json字符串形式的Post。為此,RxHttp提供了兩個發(fā)送Post請求的操作符,分別是postFormpostJosn,此時,我們就可以這樣發(fā)送Post請求

RxHttp.postForm("http://...")  //發(fā)送表單形式的Post請求           
    .asString()                //返回String類型      
    .subscribe(s -> {          //訂閱觀察者,
        //請求成功                                         
    }, throwable -> {                                  
        //請求失敗                                         
    });  
    
RxHttp.postJson("http://...")  //發(fā)送Json字符串單形式的Post請求           
    .asString()                //返回String類型      
    .subscribe(s -> {          //訂閱觀察者,
        //請求成功                                         
    }, throwable -> {                                  
        //請求失敗                                         
    });    

如果想發(fā)送Delete、Put等其它方式的請求,同理,如下:

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

最后,我們來看下,RxHttp都提供了哪些請求方式,如下:

image

其中getpostForm、postJson上面已經(jīng)講過了,其它的同理,這里就不再講述了。

請求方式確定了,如何添加參數(shù)或者頭像信息呢?so easy!!!,只需調(diào)用add、addHeader即可,如下:

RxHttp.postForm("http://...")  //發(fā)送表單形式的Post請求     
    .add("key","value")        //添加請求參數(shù),該方法可調(diào)用多次                 
    .addHeader("headerKey","headerValue")  //添加請求頭參數(shù),該方法可調(diào)用多次 
    .asString()                //返回String類型      
    .subscribe(s -> {          //訂閱觀察者,
        //請求成功                                         
    }, throwable -> {                                  
        //請求失敗                                         
    }); 

第二步,確定返回數(shù)據(jù)類型

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

image

其中,asBoolean、asInteger、asLong、asString等,我想很好理解,就是返回基本類型的裝箱類型,這個不就過多講解。這里我們重點看下asObject、asList、asDownload這3個操作符。

asObject

顯示開發(fā)中,我們返回的更多是自定義的數(shù)據(jù)類型,比如我們想得到一個Student對象,此時,我們就可以用asObject操作符,如下:

RxHttp.get("http://...")       //發(fā)送Get請求         
    .asObject(Student.class)   //指定返回User類型數(shù)據(jù) 
    .subscribe(student -> {    //訂閱觀察者,
        //請求成功,這里student就是Student對象                                         
    }, throwable -> {                                  
        //請求失敗                                         
    });  
asList

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

RxHttp.get("http://...")        //發(fā)送Get請求         
    .asList(Student.class)      //指定返回User類型數(shù)據(jù) 
    .subscribe(students -> {    //訂閱觀察者,
        //請求成功,這里students就是List<Student>對象                                         
    }, throwable -> {                                  
        //請求失敗                                         
    });  

注:asXXX操作符,內(nèi)部會默認(rèn)指定請求在Schedulers.io()線程執(zhí)行

asDownload

當(dāng)我們需要下載文件,就用此操作符,如下:

 RxHttp.get("http://...")        //Get請求                         
     .asDownload(".../rxhttp.apk")  //使用asDownload操作符,并傳入存儲路徑
     .subscribe(s -> {                                       
         //下載成功回調(diào),s為文件存儲路徑                                   
     }, (OnError) throwable -> {                             
         //下載失敗回調(diào)                                            
     });                                                     

更多文件操作,請查看Android 史上最優(yōu)雅的實現(xiàn)文件上傳、下載及進(jìn)度的監(jiān)聽

第三步,訂閱觀察者

在上一步中,細(xì)心的你也許發(fā)現(xiàn)了,使用了asXXX操作符后,會返回一個Observable對象,那這個又是什么對象呢?其實它就是RxJava內(nèi)部的Observable對象。

在這,可以告訴你,當(dāng)我們調(diào)用asXXX操作符,拿到Observable對象后,RxHttp就已經(jīng)完成了它的使命,接下來的事情都丟給了RxJava。拿到Observable對象,結(jié)合RxJava強(qiáng)大的操作符,我們可以做非常多的事情,比如我們想要在主線程回調(diào)觀察者,如下:

RxHttp.get("http://...")        //發(fā)送Get請求         
    .asList(Student.class)      //指定返回User類型數(shù)據(jù) 
    .observeOn(AndroidSchedulers.mainThread())  //主線程回調(diào)觀察者
    .subscribe(students -> {    //訂閱觀察者,
        //請求成功,這里students就是List<Student>對象                                         
    }, throwable -> {                                  
        //請求失敗                                         
    });  

注:請求默認(rèn)在Schedulers.io()線程執(zhí)行,如未指定觀察者所在線程,則默認(rèn)在請求所在線程回調(diào)

小結(jié)

好了,請求三部曲就講解結(jié)束,到這,你已經(jīng)掌握了RxHttp 70% 的功能,并且掌握了RxHttp的精髓----請求三部曲,在任意請求中,就能做到以不變應(yīng)萬變。
本篇文章的目的在于提供一個簡單的入門教程,更多功能請查看

RxHttp 一條鏈發(fā)送請求,新一代Http請求神器(一)

RxHttp 一條鏈發(fā)送請求之強(qiáng)大的數(shù)據(jù)解析功能(二)

RxHttp 一條鏈發(fā)送請求之強(qiáng)大的Param類(三)

RxHttp 一條鏈發(fā)送請求之注解處理器 Generated API(四)

Android 史上最優(yōu)雅的實現(xiàn)文件上傳、下載及進(jìn)度的監(jiān)聽

問題簡答

最后,借此機(jī)會,簡單解答一下讀者反饋的問題

1、RxHttp支持Https嗎?

答:支持,RxHttp內(nèi)置默認(rèn)的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默認(rèn)沒有做任何緩存處理,如有需要,請自定義OkHttpClient對象開啟緩存,并使用RxHttp發(fā)送請求時,使用cacheControl(CacheControl cacheControl)設(shè)置緩存策略

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

答:session或者token涉及到具體的業(yè)務(wù)邏輯,故RxHttp暫時并沒有做深度封裝。如有需要,可自定義OkHttpClient對象通過攔截器去實現(xiàn)。

4、RxHttp支持kotlin嗎?

答:必須支持,但是依賴注解處理器時,需要使用kapt代替annotationProcessor

5、RxHttp如何支持多任務(wù)列表下載

答:在最新的Demo中,已有案例,歡迎下載Demo體驗

在使用過程中,如遇到什么問題,環(huán)境加群交流RxHttp&RxLife 交流群:378530627

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容