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

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

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
拦截 Retrofit参数,可以通过自定义 OkHttp 的拦截器来实现。以下是一个简单的拦截器示例: ```java public class CustomInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); if (request.method().equals("POST")) { // 获取请求体 RequestBody requestBody = request.body(); if (requestBody instanceof FormBody) { // 构造新的请求体 FormBody.Builder newFormBodyBuilder = new FormBody.Builder(); FormBody oldFormBody = (FormBody) requestBody; for (int i = 0; i < oldFormBody.size(); i++) { // 获取原请求体中的参数名和参数值 String name = oldFormBody.name(i); String value = oldFormBody.value(i); // 对参数值进行处理 String newValue = processParamValue(value); // 添加到新的请求体中 newFormBodyBuilder.add(name, newValue); } // 构造新的请求 Request newRequest = request.newBuilder() .post(newFormBodyBuilder.build()) .build(); // 发送新的请求 return chain.proceed(newRequest); } } // 不需要拦截,直接发送原请求 return chain.proceed(request); } // 对参数值进行处理的方法 private String processParamValue(String value) { // TODO: 在这里对参数值进行处理 return value; } } ``` 在 Retrofit 的初始化中,添加这个拦截器即可: ```java OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new CustomInterceptor()) .build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://example.com/") .client(client) .build(); ``` 以上示例仅演示了如何拦截 POST 请求中的参数,并对参数值进行处理。如果需要拦截 GET 请求或其他类型的请求,或者需要对参数名进行处理,都可以修改拦截器的代码来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值