包UTIL;
進口java.io.BufferedReader中;
進口java.io.IOException異常;
進口的java.io.InputStream;
進口java.io.InputStreamReader中;
進口.
進口java.text.SimpleDateFormat的;
進口的java.util.ArrayList;
進口java.util.Date;
進口的java.util.HashMap;
進口的java.util.List .Map;
進口java.util.Set中;
進口java.util.Map.Entry;
進口java.util.zip.GZIPInputStream;
進口org.apache.commons.httpclient.Header; .commons.httpclient.HttpClient;
進口org.apache.commons.httpclient.HttpException;
進口org.apache.commons.httpclient.HttpMethod;
進口org.apache.commons.httpclient.HttpMethod;
進口org.apache.commons.httpclient.Http .httpclient.NameValuePair;
進口org.apache.commons.httpclient.SimpleHttpConnectionManager;
進口org.apache.commons.httpclient.methods.GetMethod;
進口org.apache.commons.httpclicli.com .commons.httpclient.params.HttpConnectionManagerParams;
進口org.apache.commons.httpclient.params.HttpMethodParams;
/ **
* @author六味
*日期:2009年12月18日
*
* TODO
* HttpClient的輔助類
* /
publicHtttt超時,讀取資料逾時時間設定(單位:毫秒)
* /
公共靜態最終詮釋HTTPCLIENT_CONNECTION_TIMEOUT = 30000;
公共靜態最終詮釋HTTPCLIENT_SO_TIMEOUT = 1200000; //讓的ConnectionManager管理httpclientconnection時是否關閉連接
私有靜態布林alwaysClose = FALSE;
私人靜態字串defaultEncode =「UTF-8」;
私有靜態最後的DateFormat DATE_FORMAT =新的SimpleDateFormat(「YY ”);
/ **
*取得HttpClient的連接,並設定相關參數
*
* @return
* /
公用靜態HttpClient的getHttpClient(ClYcom (alwaysClose));
HttpConnectionManagerParams managerParams = client.getHttpConnectionManager()getParams()方法。
//設置連接超時時間(單位毫秒)
managerParams.setConnectionTimeout(HTTPCLIENT_CONNECTION_TIMEOUT);
//設置讀數據超時時間(單位毫秒)
managerParams.setSoTimeout(HTTPCLIENT_SO_TIMEOUT);
返回客戶端;
}
/ * *
*取得HttpClient的連接,並設定相關參數
*
* @參數logonSite
* @參數logonPort
* @參數協定
* @return
* /
* @參數協定
* @return ? logonPort,最後弦樂協定)
{
HttpClient的客戶端=新的HttpClient(新SimpleHttpConnectionManager(alwaysClose));
client.getHostConfiguration()setHost(logonSite,logonPort,協定)。
HttpConnectionManagerParams managerParams = client.getHttpConnectionManager()getParams()方法。
//設定連線逾時時間(單位毫秒)
managerParams.setConnectionTimeout(HTTPCLIENT_CONNECTION_TIMEOUT);
//設定讀取資料逾時時間(單位毫秒)
managerParams.setSoTimeout(HTTPCLIENT_SO_TIME列表 getHeaders(地圖
{
名單 =報頭的ArrayList新();
布爾includeUserAgent = FALSE;
如果(空=頭&&假== header .isEmpty()! == includeUserAgent
&&「使用者代理程式」.equals(entry.getKey()))
{
includeUserAgent = TRUE;
}
headers.add(新標頭(entry.getKey(Key),entry.get(Key),entry.get(Key),entry.get(Key),entry.get(Key),entry);
}
}
如果(假== includeUserAgent)
{
headers.add(新標題(
“用戶代理”,
“Mozilla的/ 4.0(兼容; MSIE 7.0; Windows 的5.NET; CLR 1.1.4322; .NET CLR 2.0 0.50727; Alexa工具條; MAXTHON 2.0)“));
}
返回頭;
}
私有{
如果(空== || POSTDATA postData.isEmpty())
{
回傳NULL;
}
設定> =的entrySet postData.entrySet(); entrySet.size();
的NameValuePair [] =對新的NameValuePair [DATALENGTH]
INT I = 0;
對於(進入
{
雙[我++] =新的NameValuePair(entry.getKey(),entry.getValue());
}
傳回;
}
/ **
*請求網頁內容資訊
* *參數標題
* @參數POSTDATA
*參數編碼
* @return
* /
公共靜態字串doRequest(HttpClient的HttpClient的,字串reqUrl,
地圖的頭,
{
字串htmlContent = NULL;
如果(空== HttpClient的)
{
回傳htmlContent;
}
//請要求回填編號defaultEncode:編碼);
//頭部請求資訊
列表 =頭getHeaders(頭);
的System.out.println(“[”+ DATE_FORMAT.format(新的Date())+“] - doRequest - ”+ reqUrl);
//交方式
,如果(空= POSTDATA!)
{
的PostMethod的PostMethod =新EncodePostMethod(reqUrl,編碼);
對於(頭tempHeader:頭)
{
postMethod.setRequestHeader(tempHeader);
}
//後參數設定PairName/ );
如果(空=參數!)
{
postMethod.setRequestBody(PARAMS);
}
//提取網頁內容
htmlContent = executeMethod(HttpClient
//提取網頁內容
htmlContent = executeMethod(HttpClient)的,後方法,
其他
{
GetMethod getMethod =新的實作getMethod(reqUrl);
對於(頭tempHeader:頭)
{
getMethod.setRequestHeader(tempHeader); ,getMethod,編碼,NULL);
}
回傳htmlContent;
}
私有靜態字串getWebSite(字串reqUrl)
{
字串網站= NULL; ))
{
回網站;
}
字串字首=「HTTP://」;
如果(reqUrl.startsWith(字首))
{
INT指數= reqUrl.startsWith(字首))
{
INT指數= reqUrl.subing(字首)的字節(prefix) indexOf(「/」)+ prefix.length();
網站= reqUrl.substring(0,索引);
}
回網站;
}
/ **生活@參數的HttpClient
* @參數requestMethod
*參數編碼
*參數的網站
* @return
* /
私有靜態字串executeMethod(HttpClient的HttpClient的,列舉HTTPMethod request {
字串responseContent = NULL;
如果(空== HttpClient的)
{
傳回responseContent;
}
//SEApatceptionalatquestionalpatquestional的布林識別.接受編碼」);
如果(!空= acceptEncoding
。 && acceptEncoding.getValue()包含(「gzip的」))
{
dataEncrypt = TRUE;
}
的InputStream responseStream = N .SC_OK ==狀態)
{
responseStream = requestMethod.getResponseBodyAsStream();
responseContent = getContentByStream(dataEncry):responStreamStream,編碼)傳回01302303307時,表示頁面己經重定向,則重新請求位置的URL,這在一些登入授權取餅乾時很重要
否則,如果(HttpStatus.SC_MOVED_PERMANENTLY ==狀態
|| HttpStatus.SC_MOVED_TEMPORARILY ==狀態
|| HttpStatus.SC_MOVED_TEMPORARILY ==狀態
|| HttpStatus .SC_SEE_OTHER ==狀態
|| HttpStatus.SC_TEMPORARY_REDIRECT ==狀態)
{
//讀取新的URL位址
頭球沖頂= requestMethod.getResponseHeader(「位置」);頭球沖頂= requestMethod.getResponseHeader(「位置」);
字串的redirectUrl = header.getValue();
如果(零=的redirectUrl!
&&假== redirectUrl.isEmpty())
{
responseContent_無效; isEmpty())
{
的redirectUrl =「/」;
}
如果(假== redirectUrl.startsWith(「HTTP://」)
!&&空=網站)
「/」))
{
的redirectUrl =網站+的redirectUrl;
}
其他
{
的redirectUrl =網站+「/」+的redirectUrl;的redirectUrl);
頭引薦= requestMethod.getRequestHeader(「引薦」);
如果(空=引用者! )
{
redirect.addRequestHeader(引薦);
}
頭的cookie = requestMethod.getRequestHeader(「餅乾」);
如果(空=餅乾!)
{
red); = httpClient.executeMethod(重新導向);
如果(HttpStatus.SC_OK ==狀態)
{
responseStream = redirect.getResponseBodyAsStream();
記
}
} //端頭
} //結束狀態
}趕上(例外五)
{
e.printStackTrace();
}最後
{
如果(requestMethod!= NULL)
{
requestMethod.releaseConnection();
}
}
傳回responseContent;
}
*
*參數編碼
* @回傳
*引發IOException
* /
公用靜態字串getContentByStream(的InputStream inStream中,字串編碼)拋出IOException異常
{
如果(空格回NULL;
}
StringBuilder的內容=新的StringBuilder();
//採用指定編碼格式讀取流內容
的BufferedReader讀者=新的BufferedReader(新的InputStreamReader(插播廣告,編碼));訊息= NULL;
而(空=(訊息= reader.readLine())!)
{
content.append(訊息);
content.append(「 r n」);
}
/////關閉讀取器,釋放資源
reader.close();
返回(content.toString());
}
/ **
*內部類,繼承於的PostMethod,用來指定郵政請求編碼格式
* /
公共靜態類EncodePostMethod擴展的PostMethod
{
私人字符串編碼= NULL;
公共EncodePostMethod(URL字串,字串編碼)
{
超(URL);
this.encode ={
超(URL); 字串getRequestCharSet()
{
// TODO自動產生方法存根
回報(this.encode);
}
}
/ **
*測試
}
/ **
*測試
*測試
* *的主要(字符串[] args)
{
//System.setProperty("http.proxyHost“,”165.228.128.10“);
//System.setProperty("http.proxyPort“,”3128“); //System.setProperty("http.proxySet“,”真“);
字串reqUrl =“ http://news.39.net/jbyw/index.html ”;
reqUrl =“ http:// news.39.net/a/2010722/1404231.html ”;
地圖
headers.put(「接受編碼”,「gzip的,放氣」);
HttpClient的HttpClient的= getHttpClient();
字串htmlContent = doRequest(HttpClient的,reqUrl,頭,空,「GBK」); 的lnSystemContout.print;
}
}