文章内容

Java POST接口中文乱码问题

  • 2019-04-10 16:29:44
  • 64
  • 0
  • 0
 package test;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;

public class test {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
			System.out.println("开始访问接口地址");
			String urlpath="http://localhost:1361/api/obSpecialists";//"http://10.190.202.23/api/obSpecialists";
			 try {
		            URL url = new URL(urlpath);
		            //打开和url之间的连接
		            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		           // PrintWriter out = null;
		            
		            //设置请求的内容类型
		          
		            /**设置URLConnection的参数和普通的请求属性****start***/
		            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
		            conn.setRequestProperty("accept", "*/*");
		            conn.setRequestProperty("accept", "*/*");
		            conn.setRequestProperty("connection", "Keep-Alive");
		            conn.setRequestProperty("Charsert", "UTF-8"); //设置请求编码
		            conn.setRequestProperty("user-agent", "Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); 
		            
		            /**设置URLConnection的参数和普通的请求属性****end***/
		            
		            //设置是否向httpUrlConnection输出,设置是否从httpUrlConnection读入,此外发送post请求必须设置这两个
		            //最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,
		            //post与get的 不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
		            conn.setDoOutput(true);
		            conn.setDoInput(true);
		            
		            conn.setRequestMethod("POST");//GET和POST必须全大写
		            /**GET方法请求*****start*/
		            /**
		             * 如果只是发送GET方式请求,使用connet方法建立和远程资源之间的实际连接即可;
		             * 如果发送POST方式的请求,需要获取URLConnection实例对应的输出流来发送请求参数。
		             * */
		            conn.connect(); 
		            
		            /**GET方法请求*****end*/
		            
		            /***POST方法请求****start*/
		            
		            String s = "jstr=[{\"id\":\"1314\",\"uniqueid\":\"333\",\"phone\":\"17708xxxx54\",\"text\":\"尊敬的专家您好!邀请您2019年02月28日早上9点,
					在成都市xxx区,参加xx评审,预计会期8小时。确认参加请按1,不参加请按2\",\"mode\":\"1\"}]"; 
		          //  byte[]bt= Base64.decode(s);
		            
		            PrintWriter out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(),"utf-8"));  
		            out.print(s);
//		            out = new PrintWriter(conn.getOutputStream());//获取URLConnection对象对应的输出流 
//		            
//		            out.print(bt);//发送请求参数即数据
		            
		            out.flush();//缓冲数据
		                     
		            /***POST方法请求****end*/
		            
		            //获取URLConnection对象对应的输入流
		            InputStream is = conn.getInputStream();
		            //构造一个字符流缓存
		            BufferedReader br = new BufferedReader(new InputStreamReader(is));
		            String str = "";
		            while ((str = br.readLine()) != null) {
		            	str=new String(str.getBytes(),"UTF-8");//解决中文乱码问题
		                System.out.println(str);
		            }
		            //关闭流
		            is.close();
		            //断开连接,最好写上,disconnect是在底层tcp socket链接空闲时才切断。如果正在被其他线程使用就不切断。
		            //固定多线程的话,如果不disconnect,链接会增多,直到收发不出信息。写上disconnect后正常一些。
		            conn.disconnect();
		            System.out.println("完整结束");
		        } catch (Exception e) {
		            e.printStackTrace();
		        }

	}

}
PrintWriter out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(),"utf-8"));  
解决中文乱码的问题!!!