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對應的就是服務(wù)端返回的code嗤放,displayMsg對應兩種情況:一種是服務(wù)端返回的錯誤信息思喊,另一種則是網(wǎng)絡(luò)問題等外部錯誤信息。具體的錯誤處理邏輯我放在了Observer類中:
onNext()方法重的處理很簡單次酌,根據(jù)返回數(shù)據(jù)中的succsee字段判斷成功與否恨课,這里做了一個data的非空判斷,是為了處理有些成功但不返回data數(shù)據(jù)的情況岳服。失敗則直接調(diào)用了onError()方法剂公,將失敗的情況當作異常來處理:
根據(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ù)與響應數(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