Rxjava2+Retrofit2優雅實現token驗證失敗重新獲取token然后重新請求該接口
????公司的接口請求都需要token驗證,但是獲取的token有過期時間,所以需要一個機制來保證token過期之后重新獲取,并且繼續接口請求。那么既然每個接口都需要驗證token是否過期,如果過期就重新獲取。之前未使用rxjava和retrofit,所以在本地保存一個過期時間,到了時間請求一個接口時就在父類中先重新獲取token,然后請求接口。如今使用了rxjava和retrofit,網絡請求倒是解耦清爽,但是token獲取成了一個難題,翻閱了很多rxjava的操作符,終于有了一個方案。
1.利用請求接口失敗的錯誤碼來判斷token是否過期。
2. 如果過期了,就重新獲取token,存儲?
3. 利用新的token重新請求該接口
這里利用了rxjava的幾個操作符:
defer:只有在訂閱時才會創建observable,解決重新利用新的token生成請求的observable
flatMap:可以把observable轉換,返回一個新的observable,這里利用來進行返回結果的判斷,是否是token過期,若過期,執行return Observable.error(newApiError(5)); 讓retryWhen方法執行
retryWhen:當返回error是執行的方法,表示重試,會重新進行事件發布,而前面的defer包裹的observable會被重新創建。所以相當于重新創建一個observable并且發布。retryWhen需要一個notificationhandler處理是否要重新發布,這里我也自定義了一個類RetryWithNewToken來處理
presenter中的請求接口代碼
retryWhen的handler類
我們在RetryWithNewToken處理token失效時,重新請求token并存儲,都在io線程。
至此,結合mvp,rx.java2 retrofit2的token失效獲取機制封裝完成。在此記錄。