1. 程式人生 > >用Jsoup的post方式提交資料產生亂碼

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