最近网络网络框架库升级了一下。以前是1版本的组合。现在用这个rxjava2+okhttp3+retrofit2,有个习惯,把组合需要的库都下载成离线。所以这这个组合如下:

    api files('libs/rxjava-2.2.8.jar')    api files('libs/retrofit-2.3.0.jar')    api files('libs/okhttp-3.9.1.jar')    api files('libs/gson-2.6.2.jar')    api files('libs/converter-gson-2.3.0.jar')    api files('libs/adapter-rxjava2-2.3.0.jar')    api(name: 'rxandroid-2.0.2', ext: 'aar')    api files('libs/okio-1.15.0.jar')

上面库整体打包的下载地址:https://download.csdn.net/download/qq_16064871/11409551

随手附上一个使用示例:多参数请求和文件下载接口

public interface ManagerAPI {    @Multipart    @POST("/tap/exp/attendance")    Call attendanceSave(@PartMap Map map, @Part MultipartBody.Part file);}

返回的是直接json使用gson转成的结构体。不用担心解析,你可以在线json解析生成Java实体类。也可以用android studio的插件:

初始化:

            OkHttpClient.Builder builder = new OkHttpClient.Builder();                    builder.connectTimeout(TIMEOUT, TimeUnit.SECONDS);                    builder.readTimeout(TIMEOUT, TimeUnit.SECONDS);                    builder.writeTimeout(TIMEOUT, TimeUnit.SECONDS);                    Retrofit.Builder rBuilder2 = new Retrofit.Builder().client(builder.build()).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).baseUrl(mHostCould);                    manageAPI = rBuilder2.build().create(ManagerAPI.class);

下面就是传参,请求返回数据:

        //构建要上传的文件        Map params = new HashMap<>();        params.put("code", RequestBody.create(MediaType.parse("text/plain"), device_code));        params.put("id", RequestBody.create(MediaType.parse("text/plain"), rid));        params.put("sign", RequestBody.create(MediaType.parse("text/plain"), sign));        params.put("times", RequestBody.create(MediaType.parse("text/plain"), timestamp));        MultipartBody.Part Part = MultipartBody.Part.createFormData("img", file.getName(), RequestBody.create(MediaType.parse("image/*"), file));        Call call = newUpdateAPI.attendanceSave(params, Part);        call.enqueue(new Callback() {            @Override            public void onResponse(Call call, Response response) {                if (response.code() == 200) {                     attendance = response.body();                    if (attendance != null) {                       EventBus.getDefault().post(attendance);                     }                }            }            @Override            public void onFailure(Call call, Throwable t) {                         if(attendance != null) {                    EventBus.getDefault().post(attendance);                }            }        });

这样就完成了。

现在说说键值从小到大先后顺序排序:
1、参数排序拼装 根据参数名称(除sign本身以外)将所有请求参数按照参数键值从小到大先后顺序排序: key1=value1&key2=value2&key3=value3 ....(依次类推),最后拼接上&token=tokenValue;最后MD5加密得到签名; 例如:需要请求接口传参数 a=>"参数1",c=>“参数2”,b=>"参数3" 按参数键值排序后得到:a=参数1&b=参数2&c=参数3

2、在后面拼接token(假如token为ddssf22sfsfs44fgjh55mh)得到:a=参数1&b=参数3&c=参数2×tamp=时间戳&token=ddssf22sfsfs44f5mh

3、MD5加密得到字符串签名

代码实现:

   public static String createSign2(SortedMap parameters, String key) {        StringBuffer sb = new StringBuffer();        StringBuffer sbkey = new StringBuffer();        Set es = parameters.entrySet();  //所有参与传参的参数按照accsii排序(升序)        Iterator it = es.iterator();        while (it.hasNext()) {            Map.Entry entry = (Map.Entry) it.next();            String k = (String) entry.getKey();            Object v = entry.getValue();            //空值不传递,不参与签名组串            if (null != v && !"".equals(v)) {                sb.append(k + "=" + v + "&");                sbkey.append(k + "=" + v + "&");            }        }        //System.out.println("字符串:"+sb.toString());        sbkey = sbkey.append("token=" + key);        return StringManage.md5(sbkey.toString());    }

返回就是签名:

     String sign = StringManage.createSign2(parameters, token);

到这里就结束了

更多相关文章

  1. Dalvik——如何控制vm
  2. android jni的JNINativeMethod
  3. Android数字签名的学习
  4. mtopsdk(淘宝系android app使用的sdk)强迫请求通过代理进行抓包
  5. Android(安卓)Architecture(安卓架构)的一些研究
  6. 如何让自己写的apk获得系统权限
  7. Android检查网络是否可用及上网请求
  8. Android应用获取系统属性
  9. android retrofit2.0框架的使用介绍

随机推荐

  1. 【微信小程序】自定义导航栏(一)
  2. 【微信小程序】自定义导航栏(二)
  3. 如何在Safari浏览器中设置活跃及其他网站
  4. 20210225-1 Python错误与异常
  5. 如何在Mac上的“照片”中使用滤镜来更改
  6. 【DB宝41】监控利器PMM的使用--监控MySQL
  7. 【免费开源】基于Vue和Quasar的crudapi前
  8. MySql数据库列表数据分页查询、全文检索A
  9. 【微信小程序】引入阿里巴巴图标库iconfo
  10. 【DB宝42】MySQL高可用架构MHA+ProxySQL