天天看點

711 發送請求失敗_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'

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

三部曲解說

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

  • 如果我想發送 Post 等其它方式請求呢?
  • 檔案上傳下載下傳及進度的監聽呢?
  • 我想得到自定義的資料類型呢?

這些如何通過三部曲實作呢?别着急,接下來一一為大家講解

第一步,确定請求方式

上面例子中,我們調用了

RxHttp.get("http://...")

語句,其中

get

操作符就代碼 Get 請求。由此,我們可以猜測,發送 Post 請求,隻需要調用

post

操作符即可。然而我們隻猜對了一半,為啥這麼說呢?Post請求中,我們常見的又分為兩種,一種的表單形式的 Post,另一種是 Json 字元串形式的 Post。為此,RxHttp 提供了兩個發送 Post 請求的操作符,分别是

postForm

postJosn

,此時,我們就可以這樣發送 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 都提供了哪些請求方式,如下:

711 發送請求失敗_30秒上手新一代 Http 請求神器 RxHttp

其中

get

postForm

postJson

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

請求方式确定了,如何添加參數或者頭像資訊呢?so easy!!!,隻需調用

add

addHeader

即可,如下:

RxHttp.postForm("http://...") //發送表單形式的Post請求

.add("key","value") //添加請求參數,該方法可調用多次

.addHeader("headerKey","headerValue") //添加請求頭參數,該方法可調用多次

.asString() //傳回String類型

.subscribe(s -> { //訂閱觀察者,

//請求成功

}, throwable -> {

//請求失敗

});

第二步,确定傳回資料類型

上面的

asString

操作符代表傳回String字元串類型,RxHttp 提供了

17

asXXX

操作符,如下:

711 發送請求失敗_30秒上手新一代 Http 請求神器 RxHttp

其中,asBoolean、asInteger、asLong、asString 等,我想很好了解,就是傳回基本類型的裝箱類型,這個不就過多講解。這裡我們重點看下

asObject

asList

asDownload

這 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對象

}, 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對象

}, 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(CacheControlcacheControl)

設定緩存政策

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

答:session 或者 token 設計到具體的業務邏輯,故 RxHttp 暫時并沒有做深度封裝。如有需要,可自定義 OkHttpClient 對象通過攔截器去實作。

4、RxHttp支援kotlin嗎?

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

5、RxHttp 如何支援多任務清單下載下傳

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

繼續閱讀