因要自动提交一些数据到服务器,因此使用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编码提交数据。这其中的原因有明白的指导为谢。