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

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);
    }
}
相關文章
相關標籤/搜索