RxEasyHttp網路庫動態引數(六)
阿新 • • 發佈:2019-01-02
動態引數
動態引數就是像我們的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、時間戳)攔截器
...