問題:
??????? 你需要通過HTTP GET方法來獲取信息。
解答:
??????? 創建一個HttpClient實例,并調用以GetMethod對象為參數的executeMethod方法。然后,響應的內容就可以通過一個InputStream,byte[],或者是String來獲得。下面的例子將獲得
http://www.discursive.com /jccook/的內容,并且以一個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/的內容。如果響應的狀態碼是HttpStatus.SC_OK(即200),下列響應將被輸出到控制臺:
<html>
?<head>
??<title>JCCook?Example</title>
?</head>
?<body>
??<h1>Hello?World!</h1>
?</body>
</html>
討論:
??????? 注意這段代碼中對異常的處理。執行一個簡單的HTTP GET需要捕捉兩個異常:HttpException和IOException。如果是發生HTTP協議錯誤時,將拋出HttpException異常;如果是發生有關網絡的錯誤時,將拋出IOException異常。這一章后面的例子將會忽略對異常的處理。你應該要知道每一次調用executeMethod()都要用適當的try/catch塊包裹。
??????? GetMethod類是HttpMethod接口的一種實現。HttpMethod會被HttpClient所調用。HttpMethod實現類的生命周期是很簡單的:一個HttpMethod實例被創建,然后被HttpClient調用;一旦響應被檢測到以后,HttpMethod釋放連接并被回收使用。當HttpMethod調用了recycle()方法,相當于發送了一個信號給系統表示這個HttpMethod實例可以再被使用。releaseConnection()方法指示HttpClient釋放掉與這個HttpMethod相關聯的連接。無論在使用HttpMethod實例的過程中發生了什么,都要調用releaseConnection()來釋放網絡資源。
??????? 一旦HttpClient的executeMethod方法被調用,你可以通過HttpMethod的getStatusCode()方法來獲得響應的狀態碼。這個方法返回一個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狀態列表。當服務器返回一個錯誤的HTTP狀態是,通常還會返回一小段信息。這一小段信息可以通過HttpMethod類的getStatusText()方法獲得。
?
參考:
?????? 可以從RFC2616(http://www.zvon.org/tmRFC/RFC2616/Output/index.html)獲得HTTP GET方法的官方定義;
?????? 要獲得HTTP 狀態碼的完整列表,請參見 HttpStatus Javadoc? (http://jakarta.apache.org/commons/ httpclient/apidocs/index.html)。