java调用第三方接口返回数据中文乱码

2022-07-13 11:38:57

背景:使用HttpURLConnection发送POST请求

在测试方法中返回的是正常中文,使用Tomcat跑的程序返回的数据出现中文乱码。

然后在网上查了很多资料,说是因为Tomcat的原因,需要修改配置文件设置字符集。

后来发现改了也没有用,后来思考如果别的都没错,那会不会是因为输入流的时候没有设置字符集的原因呢?

public String callInterface(String URL, String requestMethod, String contentType, String SOAPAction, String soapXml) throws IOException{
		String result = "";
		//第一步:创建服务地址
		URL url = new URL(URL);
		//第二步:打开一个通向服务地址的连接  
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();  
        //第三步:设置参数  
        //3.1发送方式设置:POST必须大写  
        connection.setRequestMethod(requestMethod);  
        //3.2设置数据格式:content-type  SOAPAction
        connection.setRequestProperty("content-type", contentType);
        connection.setRequestProperty("SOAPAction", SOAPAction);
        //3.3设置输入输出,因为默认新创建的connection没有读写权限,  
        connection.setDoInput(true);  
        connection.setDoOutput(true);  
        //第四步:组织SOAP数据,发送请求  
        System.out.println("requestXml:"+soapXml);
        connection.connect();//可能非必须
        //将信息以流的方式发送出去
        OutputStream os = connection.getOutputStream();  
        os.write(soapXml.getBytes("UTF-8"));  
        os.flush();
        os.close();
        //第五步:接收服务端响应,打印  
        int responseCode = connection.getResponseCode();  
        if(200 == responseCode){//表示服务端响应成功  
        	//获取当前连接请求返回的数据流
            InputStream is = connection.getInputStream();  
            InputStreamReader isr = new InputStreamReader(is, "UTF-8");  
            BufferedReader br = new BufferedReader(isr);  
              
            StringBuilder sb = new StringBuilder();  
            String temp = null;  
            while(null != (temp = br.readLine())){  
                sb.append(temp);  
            }  
            /**
             * 打印结果
             */
            //response = sb.toString();
            result = sb.toString();
            System.out.println("返回XML:"+ sb.toString());  
            is.close();  
            isr.close();  
            br.close(); 
        }  
        os.close();
		return result;
	}

引用部分出自这里

/**
             * 获取数据的字符集设置并获取返回数据
             */
            in = conn.getInputStream();
            InputStreamReader isr = new InputStreamReader(in, "UTF-8");//在这里设置输入流的字符集为UTF-8
            BufferedReader br = new BufferedReader(isr);

            StringBuilder sb = new StringBuilder();
            String temp = null;
            while(null != (temp = br.readLine())){
                sb.append(temp);
            }
            result = sb.toString();
            
            // 获取返回数据
            //将原先的代码注释掉
            /*in = conn.getInputStream();
            resOut = new ByteArrayOutputStream();
            byte[] bytes = new byte[1024];
            int len;
            while ((len = in.read(bytes)) != -1) {
                resOut.write(bytes, 0, len);
            }
            result = resOut.toString();*/

最后成功解决中文乱码的问题,以后使用流的过程中一定要注意输入流与输出流的编码格式!!!!

  • 作者:纸鸢青鸾茶花香
  • 原文链接:https://blog.csdn.net/qq_60770981/article/details/122727563
    更新时间:2022-07-13 11:38:57