1. 程式人生 > >關於HttpClient模擬瀏覽器請求的參數亂碼問題解決方式

關於HttpClient模擬瀏覽器請求的參數亂碼問題解決方式

方式 ng- true param get 轉載 manman tco utf-8

轉載請註明出處:http://blog.csdn.net/xiaojimanman/article/details/44407297

http://www.llwjy.com/blogdetail/9383e88e4bc7378b8318e15b0ac33559.html

個人博客站已經上線了,網址:www.llwjy.com,歡迎大家吐槽~

--------------------------------------------------------------------------------------------------------------------------

在之前的博客中介紹了一些關於怎樣利用HttpClient去模擬瀏覽器請求,從而獲取網頁源碼,得到自己想要的內容。近期自己在做一些項目測試的時候,發下例如以下問題:


問題描寫敘述

1.使用HttpClient模擬post/get請求時,當參數中有中文,在server端解析出的參數值中的中文都是“?”。英文數字等能夠正常解析。

2.當模擬的url參數中有中文時,解析出的參數值中的中文也是“?”,例:http://hostname/test.do?name=您好


問題原因

在查閱眾多相關資料。最終找到當中的原因,眼下市面上多數的瀏覽器中url中的中文採用的都是utf-8的編碼方式。而HttpClient默認的編碼方式是gbk,因此在模擬瀏覽器請求的過程中,就會由於編碼方式不正確造成亂碼的問題。


解決方式

對於該問題,從下面兩個方面去解決:

第一步:指定HttpClient請求的編碼方式,指定編碼方式能夠有下面幾種方法:

method.getParams().setContentCharset("utf-8");
method.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,"utf-8");
method.addRequestHeader("Content-Type", "text/html; charset=UTF-8");
httpClient.getParams().setContentCharset("utf-8");
經過第一步的處理,對POST中的參數中有中文的問題已經能夠攻克了。可是url中的中文還是沒有辦法解決,這就須要第二步了。

第二步:對URL中的中文進行轉碼處理,能夠通過以下的方法對URL做一次預處理,這樣再去模擬瀏覽器的行為時,就不會出現亂碼了。

public static String encodeUrlCh (String url) throws UnsupportedEncodingException {
	String ChRegex = "([\u4e00-\u9fa5]+)";
	while (true) {
		String s = getFirstString(url, ChRegex, 1);
		if ("".equals(s)){
			return url;
		}
		url = url.replaceAll(s, URLEncoder.encode(s, "utf-8"));
	}
}
通過上面兩步,全然能夠完美的解決模擬瀏覽器行為中出現的亂碼問題。


關於HttpClient模擬瀏覽器請求的參數亂碼問題解決方式