インポート java.io.BufferedReader;
インポート java.io.InputStreamReader;インポート java.text; .SimpleDateFormat;
import java.util.Date;
import java.util.List; ;
import java.util.zip.GZIPInputStream;
import org.apache.commons.httpclient.HttpClient; apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.HttpStatus; commons.httpclient.SimpleHttpConnectionManager;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpConnectionManagerParams; org.apache.commons.httpclient.params.HttpMethodParams;
/ **
* @author Liuwei
* 日付: 2009 年 12 月 18 日
*
* TODO
* HttpClient の補助クラス
* /
public class HttpClientHelper
{
/ **
* HttpClient の接続タイムアウト、読み取りデータのタイムアウト設定 (単位: ミリ秒)
* /
Public static Final int HTTPCLIENT_CONNECTION_TIMEOUT = 30000;
Public static Final int HTTPMETHOD_SO_TIMEOUT = 5000; ConnectionManager の管理 接続を閉じるかどうかwhen httpclientconnection
private static boolean alwaysClose = FALSE;
private static string defaultEncode = "UTF-8";
private static last DateFormat = new SimpleDateFormat("YYYY-MM-DD HH:MM:SS "); **
* HttpClient 接続を取得し、関連するパラメーターを設定します
*
* @return
* /
public static HttpClient の getHttpClient()
{
HttpClient client = new HttpClient (new SimpleHttpConnectionManager (alwaysClose)); ionManagerParams managerParams = クライアント.getHttpConnectionManager() getParams() メソッド。
//接続タイムアウトを設定します (ミリ秒単位)
managerParams.setConnectionTimeout (HTTPCLIENT_CONNECTION_TIMEOUT);
//読み取りデータのタイムアウトを設定します (ミリ秒単位)
クライアントに戻ります。
/ * *
* HttpClient 接続を取得し、関連するパラメーターを設定します
*
* @parameter logonSite
* @parameter logonPort
* @parameter Protocol
* @return
* /
public static HttpClient の getHttpClient (最後の文字列 logonSite、最終解釈 logonPort 、最後の文字列プロトコル)
{
HttpClient client = new HttpClient(new SimpleHttpConnectionManager(alwaysClose));
client.getHostConfiguration() setHost(logonSite, logonPort, プロトコル)。
HttpConnectionManagerParams managerParams = client.getHttpConnectionManager() getParams() メソッド。
//接続タイムアウトを設定します (ミリ秒単位)
managerParams.setConnectionTimeout (HTTPCLIENT_CONNECTION_TIMEOUT);
//読み取りデータのタイムアウトを設定します (ミリ秒単位)
クライアントに戻ります。
プライベートstatic List
{
List
if ( empty = header&& false == ヘッダー) .isEmpty() )
{
set
for (enter
if (false == includeUserAgent
&& "UserAgent".equals(entry.getKey()))
{
includeUserAgent = TRUE;
}
headers(new headers()entry.getKey(),entry.getValue()))
} }
if (false == includeUserAgent)
{
headers.add(new headers(
"UserAgent",
"Mozilla/4.0( と互換性があります。MSIE 7.0; Windows NT 5.1; GTB5; .NET CLR 1.1.4322; .NET CLR 2.0 0.50727; Alexa ツールバー; MAXTHON 2.0)"));
}
Return Header;
}
Private static NameValuePair [] getPairs(Map
{
if (null == | | POSTDATA postData.isEmpty())
{
return
}
文字列 , 文字列 >> =
INT DATALENGTH =
NameValuePair ] = 新しい NameValuePair[DATALENGTH]
INT I = 0;
For (entry
{
double[i++] = new NameValuePair(entry.getKey(),entry.getValue());
return ペア
}
/ **
*Web コンテンツ情報のリクエスト
*
* @parameter HttpClient
* @parameter reqUrl
*パラメータ タイトル
* @parameter POSTDATA
*パラメータ エンコーディング
* @return
* /
public static string doRequest(HttpClient HttpClient, String reqUrl,
Map
{
String htmlContent = NULL;
if (null == HttpClient )
{
Return htmlContent;
//エンコーディング設定のリクエスト
//ヘッダーリクエスト情報
List
//Post メソッド
if (null = POSTDATA!)
{
PostMethod PostMethod = new EncodePostMethod(reqUrl,coding);
for (header tempHeader: header)
{
postMethod.setRequestHeader(tempHeader);
//Post パラメータ設定
NameValuePair[] = PARAMS getPairs(POSTDATA ;
Other
{
) GetMethod getMethod = 新しい実装 getMethod(reqUrl);
for (head tempHeader: header)
{
getMethod.setRequestHeader(tempHeader)
}
//Web ページのコンテンツを抽出
htmlContent =executeMethod(HttpClient , getMethod, encoding, NULL) );
}
Return htmlContent;
プライベート静的文字列 getWebSite(String reqUrl)
{
String website = NULL;
if (null == reqUrl || reqUrl.isEmpty( ))
{
Web サイトに戻る
}
文字列プレフィックス = "HTTP://";
if (reqUrl.startsWith(prefix))
{
INT インデックス = reqUrl.substring(prefix.length()) IndexOf("/") + prefix.length ();
Website = reqUrl.substring(0,index);
}
Web サイトに戻る
}
/ **
* HTTPMethod を列挙して Web ページのコンテンツを取得します
*
* @parameter HttpClient
* requestMethod
* パラメータのエンコーディング
* パラメータのウェブサイト
* @return
* /
private static string useMethod (HttpClient HttpClient, enum HTTPMethod requestMethod, エンコードされた文字列, 文字列 Web サイト)
{
String responseContent = NULL; )
{
return responseContent;
}
//暗号化されたデータをリクエストするかどうかを決定する
Boolean dataEncrypt = FALSE;
Header acceptEncoding = requestMethod.getRequestHeader(" エンコーディングを受け入れる");空 = acceptEncoding
。 && acceptEncoding.getValue() contains("gzip"))
{
dataEncrypt = TRUE;
InputStream responseStream = NULL;
INT status = httpClient.executeMethod(requestMethod)
if(HttpStatus .SC_OK) == ステータス)
{
responseStream = requestMethod.getResponseBodyAsStream();
responseContent = getContentByStream(dataEncrypt new GZIPInputStream(responseStream): responseStream, encoding);
responseStream.close()
//リターン コードが 30130 2303307 の場合これは、ページがリダイレクトされたことを意味し、その場所の URL を再リクエストします。これは、Cookie を取得するために一部のログイン認証が使用される場合に重要です。それ以外の場合、(HttpStatus.SC_MOVED_PERMANENTLY == ステータス
|| HttpStatus.SC_MOVED_TEMPORARILY = = ステータス
|| HttpStatus .SC_SEE_OTHER == ステータス
|| HttpStatus.SC_TEMPORARY_REDIRECT == ステータス)
{
//新しい URL アドレスを読み取ります
Header = requestMethod.getResponseHeader("position"); )
{
String redirectUrl = header.getValue();
if (null = redirectUrl!
&& false == redirectUrl.isEmpty())
{
responseContent = void
if (null == redirectUrl || redirectUrl.isEmpty; ())
{
redirectUrl = "/";
}
if (false == redirectUrl.startsWith("http://")
! && empty = website)
{
if (website.startsWith( "/ "))
{
redirectUrl = website + redirectUrl;
}
other
{
redirectUrl = website + "/" + redirectUrl;
}
}
GetMethod リダイレクト = 新しい実装 getMethod( redirectUrl);
ヘッダリファラー = requestMethod .getRequestHeader("リファラー");
if (null = リファラー! ; + }
} //ターミナル
} //終了ステータス
} の追いつき (例外 5)
{
e.printStackTrace()
}最後に
{
;If (requestMethod! = NULL)
{
requestMethod.releaseConnection();
}
}
ReturnContent;
}
/ **
* 指定されたエンコーディングに従ってストリームから情報を読み取る
*
* @parameter inStream
*パラメータエンコーディング
* @return
*IOExceptionをスローします
* /
パブリック静的文字列getContentByStream(InputStream inStream, Stringエンコーディング)はIOExceptionをスローします
{
if (null == Break)
{
return NULL
}
StringBuilder content = new StringBuilder();
//指定されたエンコード形式を使用してストリーム コンテンツを読み取ります
BufferedReader (new InputStreamReader(Interstitial, encoding));
String message = NULL; .readLine())!)
{
content.append(message);
content.append("r n")
}
// リーダーを閉じ、リソースを解放します
reader.close(); toString());
}
/ **
*PostMethod から継承された内部クラス。郵便リクエストのエンコード形式を指定するために使用されます
* /
EncodePostMethod によって拡張されたパブリック静的クラス PostMethod
{
プライベート文字列エンコーディング = NULL;
public EncodePostMethod(URL String, String encode)
{
super(URL);
this.encode = encode;
}
@override
public String getRequestCharSet()
{
// TODO メソッド スタブを自動的に生成します
return ( this.encode);
}
}
/ **
* テスト
*
* @parameter ARGS
* /
public static valid main(String[] args)
{
//System.setProperty("http .proxyHost", "165.228.128.10");
//System.setProperty("http.proxyPort", "3128");
//System.setProperty("http.proxySet","true");
String reqUrl = " http://news.39.net/jbyw/index.html ";
reqUrl = " http:// news.39.net/a/2010722/1404231.html ”;
Map
headers.put("エンコーディングを受け入れる" , "gzip,deflate");
HttpClient = getHttpClient();ヘッダー、null、"GBK");
System.out.println(htmlContent);