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.8'//註解處理器,生成RxHttp類,即可一條鏈發送請求annotationProcessor 'com.rxjava.rxhttp:rxhttp-compiler:1.0.8'

三部曲解說

到這裏相信很多人已經有疑問了

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


webp

其中getpostFormpostJson上面已經講過了,其它的同理,這裏就不再講述了。

請求方式確定了,如何添加參數或者頭像信息呢?so easy!!!,只需調用addaddHeader即可,如下:

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

第二步,確定返回數據類型

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

webp

其中,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 -> {                             
         //下載失敗回調                                            
     });

第三步,訂閱觀察者

在上一步中,細心的你也許發現了,使用了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()線程執行,如未指定觀察者所在線程,則默認在請求所在線程回調

問題簡答

最後,藉此機會,簡單解答一下讀者反饋的問題

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體驗

最後贈送福利:

於Android進階的全部學習內容,我們這邊都有系統的知識體系以及進階視頻資料,有需要的朋友可以加羣免費領取安卓進階視頻教程,源碼,面試資料,羣內有大牛一起交流討論技術;818520403
(包括自定義控件、NDK、架構設計、混合式開發工程師(React native,Weex)、性能優化、完整商業項目開發等)

webp


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章