今天出现了个问题,使用拦截器拦截request进行参数加密,传入json后出现了一串百分号的参数(%5B%7B%22id%22%3A102%2C%22t_sale_detail...等),百度了很久终于看到了这个文章https://www.cnblogs.com/yangxiaomei/p/9019999.html。原来@Field传入的参数会自己编码,反编码后就可以获取原本的JSON数据了。
private Request addPostParamsSign(Request request) throws UnsupportedEncodingException {
if (request.body() instanceof FormBody) {
FormBody.Builder bodyBuilder = new FormBody.Builder();
FormBody formBody = (FormBody) request.body();
//原有的参数
TreeMap<String, String> oldparams = new TreeMap<>();
for (int i = 0; i < formBody.size(); i++) {
if ("data".equals(formBody.encodedName(i))) {
String jsonStr = java.net.URLDecoder.decode( formBody.encodedValue(i),"UTF-8");
oldparams.put(formBody.encodedName(i), jsonStr);
} else {
oldparams.put(formBody.encodedName(i), formBody.encodedValue(i));
}
}
//拼装新的参数
TreeMap<String, String> newParams = dynamic(oldparams);
//Logc.i("======post请求参数===========");
for (Map.Entry<String, String> entry : newParams.entrySet()) {
String value = URLEncoder.encode(entry.getValue(), Charset.forName("UTF-8").name());
bodyBuilder.addEncoded(entry.getKey(), value);
}
formBody = bodyBuilder.build();
request = request.newBuilder().post(formBody).build();
} else if (request.body() instanceof MultipartBody) {
MultipartBody multipartBody = (MultipartBody) request.body();
MultipartBody.Builder bodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
List<MultipartBody.Part> oldparts = multipartBody.parts();
//拼装新的参数
List<MultipartBody.Part> newparts = new ArrayList<>();
newparts.addAll(oldparts);
TreeMap<String, String> oldparams = new TreeMap<>();
TreeMap<String, String> newParams = dynamic(oldparams);
for (Map.Entry<String, String> stringStringEntry : newParams.entrySet()) {
MultipartBody.Part part = MultipartBody.Part.createFormData(stringStringEntry.getKey(), stringStringEntry.getValue());
newparts.add(part);
}
for (MultipartBody.Part part : newparts) {
bodyBuilder.addPart(part);
}
multipartBody = bodyBuilder.build();
request = request.newBuilder().post(multipartBody).build();
} else {
request = getRequest(request);
}
return request;
}