Retrofit2 POST参数拦截加密 JSON多了很多百分号的问题

本文介绍了解决使用拦截器进行参数加密时,JSON数据出现百分号编码的问题。通过反编码@Field传入的参数,成功获取原始JSON数据,适用于FormBody和MultipartBody。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  今天出现了个问题,使用拦截器拦截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;
	}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值