rxjava2+okhttp3+retrofit2(请求参数按照参数键值从小到大先后顺序排序)
16lz
2021-01-26
最近网络网络框架库升级了一下。以前是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
返回就是签名:
String sign = StringManage.createSign2(parameters, token);
到这里就结束了
更多相关文章
- Dalvik——如何控制vm
- android jni的JNINativeMethod
- Android数字签名的学习
- mtopsdk(淘宝系android app使用的sdk)强迫请求通过代理进行抓包
- Android(安卓)Architecture(安卓架构)的一些研究
- 如何让自己写的apk获得系统权限
- Android检查网络是否可用及上网请求
- Android应用获取系统属性
- android retrofit2.0框架的使用介绍