HttpURLConnection使用POST方法参数乱码

如题,HttpURLConnection使用POST方法发起http请求,参数通过form来传递(并非使用URL传递参数),出现了中文乱码的情况。

具体描述为:将请求参数以

Content-Disposition: form-data; name="name" 

value

形式上传,然后使用OutputStream.write传送,结果中文参数会出现乱码。

因为调用的方法是另外的人开发的系统,他们设定了通过UTF-8解码读取,所以要求调用时使用UTF-8进行编码后才可进行。

百度谷歌了一下解决方法,有教charset设置UTF8的,如

HttpURLConnection conn = null; 
conn.setRequestProperty("Content-Type",   "multipart/form-data; charset=UTF-8; ");

也有很复杂的,每次参数拼接都设定编码的,如

 // 首先组拼文本类型的参数
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<String, String> entry : params.entrySet())
        {
            sb.append(PREFIX);
            sb.append(BOUNDARY);
            sb.append(LINEND);
            sb.append("Content-Disposition: form-data; name="" + entry.getKey() + """ + LINEND);
            sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);
            sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
            sb.append(LINEND);
            sb.append(entry.getValue());
            sb.append(LINEND);
        }

但是,这些方法都试用遍了,还是没有起效。

后来我通过这样,解决了问题:

 StringBuffer strBuf = new StringBuffer();  

strBuf.append("Content-Disposition: form-data; name=""
+ name+ "" ");
strBuf.append(value);

out.write(strBuf.toString().getBytes("UTF-8"));  

代码不是完整的。不过做法是很简单的。只需保持原本StringBuffer将参数的key和value拼接在Content-Disposition: form-data; name=的过程,最后,out.write一个byte[]时,保证这个参数byte[]数组是UTF-8编码。原来的String.getBytes()换成String.getBytes("UTF-8")即可!

有类似疑难的情况,可以这样解决!

原文地址:https://www.cnblogs.com/xianxh/p/4442019.html