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);
}
}