• 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")即可!

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

  • 相关阅读:
    Java——快速排序
    Java——归并排序
    Java——递归
    Java——希尔排序
    Java——插入排序
    Java——选择排序
    ES6快速入门
    ECharts is not Loaded
    scoped的规则
    css哪些样式属性可以继承
  • 原文地址:https://www.cnblogs.com/xianxh/p/4442019.html
Copyright © 2020-2023  润新知