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