1. 程式人生 > >RxEasyHttp網路庫動態引數(六)

RxEasyHttp網路庫動態引數(六)

動態引數

動態引數就是像我們的token、時間戳timeStamp、簽名sign等,這些引數不能是全域性引數因為是變化的,設定成區域性引數又太麻煩,每次都要獲取。token是有有效時間的或者異地登入等都會變化重新獲取,時間戳一般是根據系統的時間,sign是根據請求的url和引數進行加密簽名一般都有自己的簽名規則。有的介面需要這些引數有的介面不需要,本庫很好的解決這個問題。

1.在請求的時候可以設定下面三個引數

.accessToken(true)//本次請求是否追加token
.timeStamp(false)//本次請求是否攜帶時間戳
.sign(false)//本次請求是否需要簽名

2.需要繼承庫中提供的動態攔截器BaseDynamicInterceptor

繼承BaseDynamicInterceptor後就可以獲取到引數的設定值,請詳細看CustomSignInterceptor的註釋講解,也可以檢視Demo示例
示例:

/**
 * <p>描述:對引數進行簽名、新增token、時間戳處理的攔截器</p>
 * 主要功能說明:<br>
 * 因為引數簽名沒辦法統一,簽名的規則不一樣,簽名加密的方式也不同有MD5、BASE64等等,只提供自己能夠擴充套件的能力。<br>
 * 作者: zhouyou<br>
 * 日期: 2017/5/4 15:21 <br>
 * 版本: v1.0<br>
 */
public class CustomSignInterceptor extends BaseDynamicInterceptor<CustomSignInterceptor> { @Override public TreeMap<String, String> dynamic(TreeMap<String, String> dynamicMap) { //dynamicMap:是原有的全域性引數+區域性引數 //你不必關心當前是get/post/上傳檔案/混合上傳等,庫中會自動幫你處理。 //根據需要自己處理,如果你只用到token則不必處理isTimeStamp()、isSign()
if (isTimeStamp()) {//是否新增時間戳,因為你的欄位key可能不是timestamp,這種動態的自己處理 dynamicMap.put(ComParamContact.Common.TIMESTAMP, String.valueOf(System.currentTimeMillis())); } if (isSign()) {是否簽名 //1.因為你的欄位key可能不是sign,這種需要動態的自己處理 //2.因為你的簽名的規則不一樣,簽名加密方式也不一樣,只提供自己能夠擴充套件的能力 dynamicMap.put(ComParamContact.Common.SIGN, sign(dynamicMap)); } if (isAccessToken()) {//是否新增token String acccess = TokenManager.getInstance().getAuthModel().getAccessToken(); dynamicMap.put(ComParamContact.Common.ACCESSTOKEN, acccess); } //Logc.i("dynamicMap:" + dynamicMap.toString()); return dynamicMap;//dynamicMap:是原有的全域性引數+區域性引數+新增的動態引數 } //示例->簽名規則:POST+url+引數的拼裝+secret private String sign(TreeMap<String, String> dynamicMap) { String url = getHttpUrl().url().toString(); url = url.replaceAll("%2F", "/"); StringBuilder sb = new StringBuilder("POST"); sb.append(url); for (Map.Entry<String, String> entry : dynamicMap.entrySet()) { sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } sb.append(AppConstant.APP_SECRET); HttpLog.i(sb.toString()); return MD5.encode(sb.toString()); } }

3.設定自定義的動態攔截器

最好通過全域性的方式設定,因為一般很多介面都會使用到

 EasyHttp.getInstance()
                 ...
                .addInterceptor(new CustomSignInterceptor())//新增動態引數(簽名、token、時間戳)攔截器
                 ...