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

開胃菜

話很少說,30s倒計時開始,先來看看如何發送一個Get請求,以下:java

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

Ok,倒計時結束!!! 到這,你已經學會了RxHttp的精髓。git

是的,不用懷疑,就是這麼簡單,使用RxHttp,任意請求,任意返回數據類型,都遵循這三個步驟,咱們稱之爲請求三部曲。github

重要事情說3遍緩存

任意請求,任意返回數據類型,皆遵循請求三部曲session

任意請求,任意返回數據類型,皆遵循請求三部曲post

任意請求,任意返回數據類型,皆遵循請求三部曲學習

gradle依賴gradle

implementation 'com.rxjava.rxhttp:rxhttp:1.1.5'
//註解處理器,生成RxHttp類,便可一條鏈發送請求
annotationProcessor 'com.rxjava.rxhttp:rxhttp-compiler:1.1.5'
複製代碼

注:RxHttp類是經過註解處理器自動生成的,故須要您在項目中使用一處註解,而後rebuild 一下項目,RxHttp便可以生成。註解使用,請查看RxHttp 一條鏈發送請求之註解處理器 Generated API(四)ui

三部曲解說

到這裏相信不少人已經有疑問了spa

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

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

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

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

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

上面的asString操做符表明返回String字符串類型,RxHttp提供了20asXXX操做符,以下:

其中,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爲文件存儲路徑 
     }, 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支持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();                                                 
複製代碼

二、RxHttp支持緩存處理嗎?

答:支持,可是RxHttp默認沒有作任何緩存處理,若有須要,請自定義OkHttpClient對象開啓緩存,並使用RxHttp發送請求時,使用cacheControl(CacheControl cacheControl)設置緩存策略

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

答:session或者token涉及到具體的業務邏輯,故RxHttp暫時並無作深度封裝。若有須要,可自定義OkHttpClient對象經過攔截器去實現。

四、RxHttp支持kotlin嗎?

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

五、RxHttp如何支持多任務列表下載

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

六、對比Retrofit有什麼優點?

答:優點以下:

在使用過程當中,如遇到什麼問題,環境加羣交流RxHttp&RxLife 交流羣:378530627

相關文章
相關標籤/搜索