okhttp3.x+retrofit2.x post請求加密(多類型:普通參數(加密)+圖片上傳(不加密))ide
上一篇 咱們作了普通傳輸加密請求,而這一次是有多種類型參數,要求普通參數加密,圖片不加密post
這裏不相同的地方有兩種ui
請求參數加密
@POST(Url) @Multipart Observable<BaseServerModel<Void>> setRealName(@Query("id") String id , @Part List<MultipartBody.Part> files);
在原來的攔截器裏面多加了一種類型url
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); } }