java post请求参数传输问题

平凡的运维民工 2016-12-23 02:53:45
发送关键代码如下
URL url = new URL(apiUrl);//根据参数创建URL对象
HttpURLConnection con = (HttpURLConnection) url.openConnection();//得到HttpURLConnection对象
con.setRequestMethod("POST");
con.setReadTimeout(5000);
con.setUseCaches(false);
con.setDoInput(true);
con.setDoOutput(true);
con.setInstanceFollowRedirects(true);
con.addRequestProperty("Content-Type", "application/x-www-form-urlencoded");
con.connect();
PrintStream out = new PrintStream(con.getOutputStream()) {
};
JSONObject object = new JSONObject();
Map<String, String> map = new HashMap<String, String>();
map.put("pn", pnInfo);
map.put("type", pnType);

BASE64Encoder enc = new BASE64Encoder();
System.out.println(map.toString());
byte[] se = SecurityTool.AESEncrypt(map.toString(), requestSecret);
object.put("resp_body", enc.encode(se));
out.print(object.toString());
out.flush();
out.close();


之前发现byte[]数组发送的到了接口之后request取出来数据会改变,查了一些资料和看了一些博客,好像是因为byte组合不能够
映射所有的char,所以会导致错误,然后用加密后的子串用base64编码之后再发送,数据好像正常了一点,但是在request里面还是会有问题
这是发送前的body


这是发送后的body

可以看到,key里面包含了发送前的key和value,而且body不仅后面的等号没了,连中间的加号也没了,value里面居然还有一个括号。。。实在不清楚到底是什么机制来进行参数传递的,不能够将key和value分开就算了,还对一些符号进行删减
这个问题困扰了2天,实在没找到什么解决方法,特地来求助大神,自己java开发经验尚浅,想看源码,点进去感觉就出不来了。。高分求助,谢谢
...全文
1004 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
nikyotensai 2016-12-23
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
引用 6 楼 zyz1985 的回复:

URLDecoder.decode(value)
看少了,真眼瞎,谢谢大大
游一游走一走 2016-12-23
  • 打赏
  • 举报
回复

URLDecoder.decode(value)
  • 打赏
  • 举报
回复
引用 3 楼 zyz1985 的回复:
贴错了
out.print("resp_body="+URLEncoder.encode(enc.encode(se)))

像这种数据传输前,但传输过后发现变成了下面这个结果

虽然key和value顺利分开了,但是会把AES加密过程中产生的“+”给删减掉,请问这个问题怎么解决
  • 打赏
  • 举报
回复
可以用PrintStream作为输出流把数据传过去的,结果和outputStreamwriter的write方法一样
游一游走一走 2016-12-23
  • 打赏
  • 举报
回复
贴错了 out.print("resp_body="+URLEncoder.encode(enc.encode(se)))
游一游走一走 2016-12-23
  • 打赏
  • 举报
回复


        object.put("resp_body", enc.encode(se));
        out.print(object.toString());
        //修改为这个就可以了,因为你有这个con.addRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        out.print("resp_body="+enc.encode(se))
  • 打赏
  • 举报
回复
补充一下,map是通过直接取得到的 StringBuilder sb = new StringBuilder(); Map map = request.getParameterMap(); 而且还有一点,就是如果post的参数是直接用map而不是用上面的jsonobject.toString,会直接key里面只有部分参数子串,另外一部分在value里面,但有一个共同点就是会删减字符,由于post是用aes加密,base64编码,所以会补位增加=,如果把这些字符删除,就会导致服务端解析出错,测试这么久头都快大了,今天周五了,想过一个心情愉悦的周末啊~~~~跪求指点,谢谢啊

50,527

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧