okhttp3.x+retrofit2.x post请求加密(二)

okhttp3.x+retrofit2.x post请求加密(多类型:普通参数(加密)+图片上传(不加密))

上一篇 我们做了普通传输加密请求,而这一次是有多种类型参数,要求普通参数加密,图片不加密

这里不相同的地方有两种

请求参数

    @POST(Url)
    @Multipart
    Observable<BaseServerModel<Void>> setRealName(@Query("id") String id , @Part List<MultipartBody.Part> files);

在原来的拦截器里面多加了一种类型

public class UrlInterceptor implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        //作用:将post中的请求参数取出加密,并且替换原来的请求参数;ps:重新添加的参数是Query形式,并未添加到encode中
        //将加密后的data直接使用addEnable请求不成功,可能和后台的请求类型有关系
        HashMap<String, Object> map = new HashMap<>();

        //使用@Field添加参数
        if ("POST".equals(request.method()) && request.body() instanceof FormBody) {//post请求有参数时
            FormBody formBody = (FormBody) request.body();
            FormBody.Builder bodyBuilder = new FormBody.Builder();//新建一个请求Body
            if (formBody.size() > 0) {
                for (int i = 0; i < formBody.size(); i++) {//将post请求的参数依次取出再加密
                    map.put(formBody.encodedName(i), formBody.encodedValue(i));
                }
            }
            request = request.newBuilder()
                    .post(bodyBuilder.build())//请求新的请求参数
                    .url(request.url()
                            .newBuilder()
                            .addQueryParameter("data", RSAUtils.encrypt(map))  //data是需要的字段
                            .build())
                    .build();


        } else if (request.body() instanceof MultipartBody) {//@Part+@Query
            String url = request.url().toString();//获取完整的url
            String[] parts = url.split("\\?");//将url中的地址和参数分开
            if (parts.length > 1) {//后面的参数
                String[] params = parts[1].split("&");
                for (String pair : params) {
                    String[] param = pair.split("=");
                    if (param.length != 2) {
                        //没有value的参数不进行处理
                        continue;
                    }
                    map.put(param[0], param[1]);
                }

            }
            //添加的part的位置不能错乱
            MultipartBody.Builder multiBuilder = new MultipartBody.Builder();
            //将加密后的参数放在part上
            multiBuilder.addPart(
                    Headers.of("Content-Disposition", "form-data; name=\"data\"", "Content-Transfer-Encoding", "binary"),
                    RequestBody.create(MediaType.parse("text/plain; charset=UTF-8"), RSAUtils.encrypt(map)));

            MultipartBody multipartBody = (MultipartBody) request.body();
            if (multipartBody.parts().size() > 0) {//原来文件中需要上传的图片;不需要加密
                for (MultipartBody.Part part : multipartBody.parts()) {
                    if (!"image/jpg".equals(part.body().contentType().toString())) {//图片类型 上传
                        continue;
                    }
                    multiBuilder.addPart(part);
                }

            }
            request = new Request.Builder()//新建一个request
                    .post(multiBuilder.build())//将新的MultipartBody添加进去
                    .build();

//                            request = new Request.Builder()
//                                    .url(parts[0])
//                                    .post(multiBuilder
//                                            .build())
//                                    .build();//将后面的参数截取掉
//                            request = request.newBuilder()
//                                    .url(request.url()
//                                            .newBuilder()
//                                            .addQueryParameter("data", RSAUtils.encrypt(map))
//                                            .build())
//                                    .build();
        }
        return chain.proceed(request);
    }
}

转载于:https://my.oschina.net/u/2483853/blog/1787605

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值