[HttpClient] 執(zhí)行HTTP GET方法 (from Jakarta Commons Cookbook 11。3)
問題:??????? 你需要通過HTTP GET方法來獲取信息。
解答:
??????? 創(chuàng)建一個HttpClient實例,并調(diào)用以GetMethod對象為參數(shù)的executeMethod方法。然后,響應的內(nèi)容就可以通過一個InputStream,byte[],或者是String來獲得。下面的例子將獲得 http://www.discursive.com /jccook/的內(nèi)容,并且以一個String來獲得響應。
???????
?1?import?org.apache.commons.httpclient.HttpClient;
?2?import?org.apache.commons.httpclient.HttpException;
?3?import?org.apache.commons.httpclient.HttpMethod;
?4?import?org.apache.commons.httpclient.methods.GetMethod;
?5?
?6?HttpClient?client?=?new?HttpClient(?);
?7?String?url?=?"http://www.discursive.com/jccook/";
?8?HttpMethod?method?=?new?GetMethod(?url?);
?9?
10?try?{
11?????client.executeMethod(?method?);
12?
13?????if(?method.getStatusCode(?)?==?HttpStatus.SC_OK?)?{
14?????????String?response?=?method.getResponseBodyAsString(?);
15?????????System.out.println(?response?);
16?????}
17?}?catch(?HttpException?he?)?{
18?????System.out.println(?"HTTP?Problem:?"?+?he.getMessage(?)?);
19?}?catch(?IOException?ioe?)?{
20?????System.out.println(?"IO?Exeception:?"?+?ioe.getMessage(?)?);
21?}?finally?{
22?????method.releaseConnection(?);
23?????method.recycle(?);
24?}
???? 這段代碼用HTTP GET方法獲得了
http://www.discursive.com/jccook/的內(nèi)容。如果響應的狀態(tài)碼是HttpStatus.SC_OK(即200),下列響應將被輸出到控制臺:?2?import?org.apache.commons.httpclient.HttpException;
?3?import?org.apache.commons.httpclient.HttpMethod;
?4?import?org.apache.commons.httpclient.methods.GetMethod;
?5?
?6?HttpClient?client?=?new?HttpClient(?);
?7?String?url?=?"http://www.discursive.com/jccook/";
?8?HttpMethod?method?=?new?GetMethod(?url?);
?9?
10?try?{
11?????client.executeMethod(?method?);
12?
13?????if(?method.getStatusCode(?)?==?HttpStatus.SC_OK?)?{
14?????????String?response?=?method.getResponseBodyAsString(?);
15?????????System.out.println(?response?);
16?????}
17?}?catch(?HttpException?he?)?{
18?????System.out.println(?"HTTP?Problem:?"?+?he.getMessage(?)?);
19?}?catch(?IOException?ioe?)?{
20?????System.out.println(?"IO?Exeception:?"?+?ioe.getMessage(?)?);
21?}?finally?{
22?????method.releaseConnection(?);
23?????method.recycle(?);
24?}
<html>
?<head>
??<title>JCCook?Example</title>
?</head>
?<body>
??<h1>Hello?World!</h1>
?</body>
</html>
?<head>
??<title>JCCook?Example</title>
?</head>
?<body>
??<h1>Hello?World!</h1>
?</body>
</html>
討論:
??????? 注意這段代碼中對異常的處理。執(zhí)行一個簡單的HTTP GET需要捕捉兩個異常:HttpException和IOException。如果是發(fā)生HTTP協(xié)議錯誤時,將拋出HttpException異常;如果是發(fā)生有關(guān)網(wǎng)絡的錯誤時,將拋出IOException異常。這一章后面的例子將會忽略對異常的處理。你應該要知道每一次調(diào)用executeMethod()都要用適當?shù)膖ry/catch塊包裹。
??????? GetMethod類是HttpMethod接口的一種實現(xiàn)。HttpMethod會被HttpClient所調(diào)用。HttpMethod實現(xiàn)類的生命周期是很簡單的:一個HttpMethod實例被創(chuàng)建,然后被HttpClient調(diào)用;一旦響應被檢測到以后,HttpMethod釋放連接并被回收使用。當HttpMethod調(diào)用了recycle()方法,相當于發(fā)送了一個信號給系統(tǒng)表示這個HttpMethod實例可以再被使用。releaseConnection()方法指示HttpClient釋放掉與這個HttpMethod相關(guān)聯(lián)的連接。無論在使用HttpMethod實例的過程中發(fā)生了什么,都要調(diào)用releaseConnection()來釋放網(wǎng)絡資源。
??????? 一旦HttpClient的executeMethod方法被調(diào)用,你可以通過HttpMethod的getStatusCode()方法來獲得響應的狀態(tài)碼。這個方法返回一個int,對應于HttpStatus類的public static final 變量。HttpStatus類還包括下面一些常量:SC_OK(200),SC_NOT_FOUND(404),SC_INTERNAL_SERVER_ERROR(500),SC_MOVED_TEMPORARILY (302),SC_UNAUTHORIZED(401)等等。請參照HttpStatus的Javadoc來獲得所有的HTTP狀態(tài)列表。當服務器返回一個錯誤的HTTP狀態(tài)是,通常還會返回一小段信息。這一小段信息可以通過HttpMethod類的getStatusText()方法獲得。
?
參考:
?????? 可以從RFC2616(http://www.zvon.org/tmRFC/RFC2616/Output/index.html)獲得HTTP GET方法的官方定義;
?????? 要獲得HTTP 狀態(tài)碼的完整列表,請參見 HttpStatus Javadoc? (http://jakarta.apache.org/commons/ httpclient/apidocs/index.html)。
posted on 2006-04-04 00:18 guangnian 閱讀(3935) 評論(0) 編輯 收藏 所屬分類: Jakarta Commons