本文出自「掘金社群」,歡迎戳「閱讀原文」連結和作者進行技術交流 🎉🎉
開胃菜
話不多說,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 都提供了哪些請求方式,如下:
其中
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
操作符,如下:
其中,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 體驗