github源码地址:https://github.com/zhou-you/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、时间戳)拦截器
...