基于RxJava2+Retrofit+OkHttp3搭建網(wǎng)絡(luò)框架(包括添加公共參數(shù),統(tǒng)一錯誤處理,自動登錄,數(shù)據(jù)加解密)

1.相關(guān)庫的依賴

2.全局網(wǎng)絡(luò)管理

? ? 封裝思路大體都差不多,單例模式構(gòu)建全局網(wǎng)絡(luò)管理者:

? ?在構(gòu)造方法中初始化OkHttpClient和Retrofit: ? ? ??

3.公共參數(shù)添加

? ?項目中經(jīng)常會要求接口添加一些公共的請求參數(shù),例如手機版本信息,app版本,系統(tǒng)版本,時間戳等。 okhttp提供了強大的攔截器Interceptor,基于此實現(xiàn)公共參數(shù)的統(tǒng)一添加:

4.統(tǒng)一錯誤處理

一般后臺返回的json數(shù)據(jù)都有統(tǒng)一格式,例如:

根據(jù)實際情況去自定義,一般都會包含code,msg,data這三個字段。然后定義一個異常類:

這個類也很簡單,code對應(yīng)的就是服務(wù)端返回的code,displayMsg對應(yīng)兩種情況:一種是服務(wù)端返回的錯誤信息,另一種則是網(wǎng)絡(luò)問題等外部錯誤信息。具體的錯誤處理邏輯我放在了Observer類中:


onNext()方法重的處理很簡單,根據(jù)返回數(shù)據(jù)中的succsee字段判斷成功與否,這里做了一個data的非空判斷,是為了處理有些成功但不返回data數(shù)據(jù)的情況。失敗則直接調(diào)用了onError()方法,將失敗的情況當(dāng)作異常來處理:

根據(jù)異常類型來做處理,如果異常為之前定義的ApiException,則在此處可以根據(jù)定義好的code做具體處理,如登錄信息過期,被限制登錄等等。這里僅僅將錯誤信息取出來做展示。

5.token過期時自動登錄

? ? ? ? 有種需求是客戶端請求某個接口,發(fā)現(xiàn)登錄信息已經(jīng)過期,此時要幫客戶自動登錄且登錄成功后繼續(xù)請求之前的接口,讓用戶察覺不到,也就是自動登錄。具體做法是用戶初次登錄,服務(wù)端返回token和access_token,客戶端將其保存在本地,通過access_token來訪問服務(wù)端。access_token的有效期比較短,一旦失效,服務(wù)端會返回一個401錯誤,客戶端在收到這個錯誤后,拿token去訪問一個接口生成新的access_token,然后拿著有效的access_token訪問。OkHttp提供了authenticator()方法:

實現(xiàn)的authenticator:

注意要使用同步的方式獲取refresh_token。獲取成功后將新的token放在header中繼續(xù)訪問。

6.請求參數(shù)與響應(yīng)數(shù)據(jù)的加解密

? ? ? ? 通常生產(chǎn)環(huán)境下接口請求參數(shù)和服務(wù)端返回的數(shù)據(jù)都是要經(jīng)過加密處理的,這里就需要借助retrofit的addConverterFactory()方法來實現(xiàn)。首先需要自定義一個Converter.Factory類:

主要實現(xiàn)responseBodyConverter()和requestBodyConverter()兩個方法,返回兩個Converter對象,在這兩個類里面可以實現(xiàn)加解密。由于加密的實現(xiàn)各不相同,這里不給出具體實現(xiàn),只展示解密:

具體解密方法可以按需替換。

最后還有一個統(tǒng)一的線程調(diào)度實現(xiàn),避免每個請求都去做同樣的事情:


demo地址:https://github.com/huangxshuo/RetrofittedNetwork

最后編輯于
?著作權(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)容