用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編碼提交資料。這其中的原因有明白的指導為謝。