美文网首页RxJAva OKHttp RetrofitAndroid进阶之旅
RxEasyHttp网络库动态参数(六)

RxEasyHttp网络库动态参数(六)

作者: zhou_you | 来源:发表于2017-06-10 13:28 被阅读151次

    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、时间戳)拦截器
                     ...
    

    相关文章

      网友评论

        本文标题:RxEasyHttp网络库动态参数(六)

        本文链接:https://www.haomeiwen.com/subject/brgqqxtx.html