用Jsoup的post方式提交数据产生乱码

因要自动提交一些数据到服务器,因此使用Jsoup进行操作,软件环境myeclipse 2014,jdk1.6,Jsoup1.6.1。

项目初始编码为utf-8,sendReportDatas为提交数据函数,这段代码有几点说明,首先postDataCharset函数1.6.1不支持,我在最新下载的1.11.3里面有;二,如果建项目之前没有设定为GBK编码,而是设定为utf-8,则有时候会很麻烦,代码大了修改起来让人发疯,转码这部分是后面才不得不添加的。

public void sendReportDatas (String cookie, String area, String orderId) {
		//将utf-8转换为GBK编码
		String transStr = reportDatas.get("Flow/DealInfo");
		byte bs[] = null;
		try {
			bs = transStr.getBytes("GBK");
			transStr = new String(bs, "GBK");
			reportDatas.put("Flow/DealInfo", new String(bs, "GBK"));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
    	Connection con = Jsoup.connect("提交数据的网址");
    	con.postDataCharset("GBK");
    	con.header("Accept", "text/html, application/xhtml+xml, */*"); 
    	con.header("Accept-Language", "zh-CN");
    	con.header("Referer", "xxxxxxxxxxxxxxxxx");
        con.header("Content-Type", "application/x-www-form-urlencoded");
        con.header("Accept-Encoding", "gzip, deflate");
        con.header("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0))"); 
        con.header("Host", "xxxxxxxxxxxxxxxxx");
        con.header("Connection", "Keep-Alive");
        con.header("Cache-Control", "no-cache");
        con.header("Cookie", cookie);
        con.data(reportDatas);
        try {
        	//必须得使用con.method(Connection.Method.POST).execute()提交数据,不然会乱码
        	//con.post();这种会乱码
        	System.out.println(con.method(Connection.Method.POST).execute().body());
        	Thread.currentThread();
	        Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
    }
 

        按常规设定好http头部,以Jsoup1.6.1版本提交数据reportDatas和cookie,提交后查看服务器返回数据是乱码。经查证,Jsoup1.6.1默认是以utf编码提交,已经写死,没法更改。

        在Jsoup官网上看见有postDataCharset方法,可以在提交数据时指定编码方式。但是Jsoup1.11.3貌似不支持jdk1.6,升级到jdk1.8后可以正常使用。然后用postDataCharset设定编码为GBK,如果之前项目编码为GBK就会省事很多,不用转码。如果之前编码为utf-8,那提交数据前必须转成GBK。

        神奇的事情发生了,如果是直接用con.post方法提交,无论怎么弄从服务器查出来的数据都是乱码,说明提交出去的数据已经是乱码了,这可以从抓包中可以证实。在经历多次测试后,已经基本快要放弃了,查资料时不经意间使用con.method(Connection.Method.POST).execute()提交数据后,服务器反馈的数据不是乱码了!折腾了2天的难题豁然解决,这种心情没法形容。但仍然疑问的是,用con.post和con.method(Connection.Method.POST).execute()这两种方式提交数据有区别吗?从实际测试的结果来看,con.post方式仍然是已默认的utf-8提交,con.method(Connection.Method.POST).execute()是以你指定的编码方式提交,但两种方法的前提条件是必须用postDataCharset指定编码,如果不指定,两种方式都是以utf-8编码提交数据。这其中的原因有明白的指导为谢。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值