HTTP 協議可能是現在 Internet 上使用得最多、最重要的協議了,越來越多的 Java 應用程序需要直接通過 HTTP 協議來訪問網絡資源。雖然在 JDK 的 java.net 包中已經提供了訪問 HTTP 協議的基本功能,但是對于大部分應用程序來說,JDK 庫本身提供的功能還不夠豐富和靈活。HttpClient 是 Apache Jakarta Common 下的子項目,用來提供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包,并且它支持 HTTP 協議最新的版本和建議。HttpClient 已經應用在很多的項目中,比如 Apache Jakarta 上很著名的另外兩個開源項目 Cactus 和 HTMLUnit 都使用了 HttpClient,更多使用 HttpClient 的應用可以參見http://wiki.apache.org/jakarta-httpclient/HttpClientPowered。HttpClient 項目非常活躍,使用的人還是非常多的。目前 HttpClient 版本是在 2005.10.11 發布的 3.0 RC4 。
![]() ![]() |
![]()
|
以下列出的是 HttpClient 提供的主要的功能,要知道更多詳細的功能可以參見 HttpClient 的主頁。
下面將逐一介紹怎樣使用這些功能。首先,我們必須安裝好 HttpClient。
![]() ![]() |
![]()
|
使用 HttpClient 需要以下 6 個步驟:
1. 創建 HttpClient 的實例
2. 創建某種連接方法的實例,在這里是 GetMethod。在 GetMethod 的構造函數中傳入待連接的地址
3. 調用第一步中創建好的實例的 execute 方法來執行第二步中創建好的 method 實例
4. 讀 response
5. 釋放連接。無論執行方法是否成功,都必須釋放連接
6. 對得到后的內容進行處理
根據以上步驟,我們來編寫用GET方法來取得某網頁內容的代碼。
HttpClient httpClient = new HttpClient(); |
GetMethod getMethod = new GetMethod("http://www.ibm.com/"); |
//設置成了默認的恢復策略,在發生異常時候將自動重試3次,在這里你也可以設置成自定義的恢復策略 |
byte[] responseBody = method.getResponseBody(); |
method.releaseConnection(); |
System.out.println(new String(responseBody)); |
下面是程序的完整代碼,這些代碼也可在附件中的test.GetSample中找到。
package test; |
根據RFC2616,對POST的解釋如下:POST方法用來向目的服務器發出請求,要求它接受被附在請求后的實體,并把它當作請求隊列 (Request-Line)中請求URI所指定資源的附加新子項。POST被設計成用統一的方法實現下列功能:
調用HttpClient中的PostMethod與GetMethod類似,除了設置PostMethod的實例與GetMethod有些 不同之外,剩下的步驟都差不多。在下面的例子中,省去了與GetMethod相同的步驟,只說明與上面不同的地方,并以登錄清華大學BBS為例子進行說 明。
String url = "http://www.newsmth.net/bbslogin2.php"; |
完整的程序代碼請參見附件中的test.PostSample
![]() ![]() |
![]()
|
下面介紹在使用HttpClient過程中常見的一些問題。
某目標頁的編碼可能出現在兩個地方,第一個地方是服務器返回的http頭中,另外一個地方是得到的html/xml頁面中。
根據RFC2616中對自動轉向的定義,主要有兩種:301和302。301表示永久的移走(Moved Permanently),當返回的是301,則表示請求的資源已經被移到一個固定的新地方,任何向該地址發起請求都會被轉到新的地址上。302表示暫時 的轉向,比如在服務器端的servlet程序調用了sendRedirect方法,則在客戶端就會得到一個302的代碼,這時服務器返回的頭信息中 location的值就是sendRedirect轉向的目標地址。
HttpClient支持自動轉向處理,但是象POST和PUT方式這種要求接受后繼服務的請求方式,暫時不支持自動轉向,因此如果碰到 POST方式提交后返回的是301或者302的話需要自己處理。就像剛才在POSTMethod中舉的例子:如果想進入登錄BBS后的頁面,必須重新發起 登錄的請求,請求的地址可以在頭字段location中得到。不過需要注意的是,有時候location返回的可能是相對路徑,因此需要對 location返回的值做一些處理才可以發起向新地址的請求。
另外除了在頭中包含的信息可能使頁面發生重定向外,在頁面中也有可能會發生頁面的重定向。引起頁面自動轉發的標簽是:<meta http-equiv="refresh" content="5; url=http://www.ibm.com/us">。如果你想在程序中也處理這種情況的話得自己分析頁面來實現轉向。需要注意的是,在上面那 個標簽中url的值也可以是一個相對地址,如果是這樣的話,需要對它做一些處理后才可以轉發。
HttpClient提供了對SSL的支持,在使用SSL之前必須安裝JSSE。在Sun提供的1.4以后的版本中,JSSE已經集成到 JDK中,如果你使用的是JDK1.4以前的版本則必須安裝JSSE。JSSE不同的廠家有不同的實現。下面介紹怎么使用HttpClient來打開 Https連接。這里有兩種方法可以打開https連接,第一種就是得到服務器頒發的證書,然后導入到本地的keystore中;另外一種辦法就是通過擴 展HttpClient的類來實現自動接受證書。
方法1,取得證書,并導入本地的keystore:
1. 用IE打開需要連接的https網址,會彈出如下對話框:
2. 單擊"View Certificate",在彈出的對話框中選擇"Details",然后再單擊"Copy to File",根據提供的向導生成待訪問網頁的證書文件
3. 向導第一步,歡迎界面,直接單擊"Next",
4. 向導第二步,選擇導出的文件格式,默認,單擊"Next",
5. 向導第三步,輸入導出的文件名,輸入后,單擊"Next",
6. 向導第四步,單擊"Finish",完成向導
7. 最后彈出一個對話框,顯示導出成功
用keytool工具把剛才導出的證書倒入本地keystore。Keytool命令在<java-home>"bin "下,打開命令行窗口,并到<java-home>"lib"security"目錄下,運行下面的命令:
keytool -import -noprompt -keystore cacerts -storepass changeit -alias yourEntry1 -file your.cer |
其中參數alias后跟的值是當前證書在keystore中的唯一標識符,但是大小寫不區分;參數file后跟的是剛才通過IE導出的證 書所在的路徑和文件名;如果你想刪除剛才導入到keystore的證書,可以用命令:
keytool -delete -keystore cacerts -storepass changeit -alias yourEntry1 |
GetMethod getMethod = new GetMethod("https://www.yourdomain.com"); |
運行該程序可能出現的問題:
1. 拋出異常java.net.SocketException: Algorithm SSL not available。出現這個異常可能是因為沒有加JSSEProvider,如果用的是IBM的JSSE Provider,在程序中加入這樣的一行:
if(Security.getProvider("com.ibm.jsse.IBMJSSEProvider") == null) |
或者也可以打開<java-home>"lib"security"java.security,在行
security.provider.1=sun.security.provider.Sun |
后面加入security.provider.3=com.ibm.jsse.IBMJSSEProvider
2. 拋出異常java.net.SocketException: SSL implementation not available。出現這個異常可能是你沒有把ibmjsse.jar拷貝到<java-home>"lib"ext"目錄下。
3. 拋出異常javax.net.ssl.SSLHandshakeException: unknown certificate。出現這個異常表明你的JSSE應該已經安裝正確,但是可能因為你沒有把證書導入到當前運行JRE的keystore中,請按照前 面介紹的步驟來導入你的證書。
方法2,擴展HttpClient類實現自動接受證書
因為這種方法自動接收所有證書,因此存在一定的安全問題,所以在使用這種方法前請仔細考慮您的系統的安全需求。具體的步驟如下:
Protocol myhttps = new Protocol("https", new MySecureProtocolSocketFactory (), 443); |
Protocol.registerProtocol("https ", myhttps); |
HttpClient中使用代理服務器非常簡單,調用HttpClient中setProxy方法就可以,方法的第一個參數是代理服務器地 址,第二個參數是端口號。另外HttpClient也支持SOCKS代理。
httpClient.getHostConfiguration().setProxy(hostName,port); |
![]() ![]() |
![]()
|
從上面的介紹中,可以知道HttpClient對http協議支持非常好,使用起來很簡單,版本更新快,功能也很強大,具有足夠的靈活性和擴 展性。對于想在Java應用中直接訪問http資源的編程人員來說,HttpClient是一個不可多得的好工具。
一、下載:
http://jadclipse.sourceforge.net/wiki/index.php/Main_Page#Download(jdaclipse插件主頁)
下載插件:
This release stream is appropriate for Eclipse 3.3.
Filename | Size | Description |
---|---|---|
net.sf.jadclipse_3.3.0.jar | 45 KB | JadClipse for Eclipse >= 3.3M6 |
This release stream is appropriate for Eclipse 3.2.
Filename | Size | Description |
---|---|---|
net.sf.jadclipse_3.2.4.jar | 45 KB | JadClipse for Eclipse >= 3.2M5 |
jadclipse_3.2.0.jar | 54 KB | JadClipse for Eclipse 3.2M3 and M4 |
This release stream is appropriate for Eclipse 3.1.
Filename | Size | Description |
---|---|---|
jadclipse_3.1.0.jar | 54 KB | JadClipse for Eclipse 3.1 (including milestone builds starting from 3.1M6 up to 3.2M2) |
myeclipse6.0 就下載JadClipse 3.3
下載Jad反編譯工具:
http://www.varaneckas.com/jad,在該頁中找到適合自己操作系統平臺的jad下載。下載后解壓,然后將解壓后的jad.exe文件復制到%JAVA_HOME%"bin目錄下面(可以將jad.exe放到任意位置,只要記住其存放路徑就好,下面要用到)。
二、安裝:
Eclipse中的插件安裝可以參考:
方法1、直接將x.x.x.jar(x.x.x.代表版本號)復制到%ECLIPSE_HOME%"plugins目錄下。
方法2、使用link方式安裝,建立D:"Myplugins"jadclipse3.2.4"eclipse"plugins的目錄結構,將jadclipse_3.2.4.jar放到plugins目錄下面(注:其中D:"Myplugins為你自己定義的一個專門放置插件的目錄)。再在%ECLIPSE_HOME%"links目錄下面建立一個jadclipse3.2.4.link文件(該文件名隨便取)。文件里面內容為:path=D:/Myplugins/jadclipse3.2.4.
三、
使用:
啟動eclipse,點擊反編譯的類文件,此時會激活jadclipse插件,在eclipse菜單中會多出一個jadclipse菜單,
如下圖所示:
一般地它會自動
反編譯相應的class文件,如果沒有自動反編譯,請點擊
jadclipse->Decompile
如下圖所示:
常見問題及解決:
(一)啟動eclipse,打開Window->Preferences->Java->JadClipse,如果沒有找到JadClipse,即JadClipse插件沒有激活。
(1)檢查插件安裝的版 本是否與你安裝的eclipse版本對應
(2)使用 –clean參數來啟動eclipse
(二)在使用JadClipse插件反編譯class文件時出現如下類似錯誤:
/*jadclipse*/
/*
DECOMPILATION REPORT
Decompiled from: D:"Program Files"Java"jdk1.5.0_12"jre"lib"rt.jar
Total time: 16 ms
Jad reported messages/errors:
Exit status: 0
Caught exceptions:
java.io.IOException: CreateProcess: (...)
請確保你的Jad路徑在eclipse中正確制定。
啟動eclipse,打開:Window->Preferences->Java->JadClipse.
1、Path to decompiler,這里設置反編譯工具jad的全路徑名,比如:%JAVA_HOME%"bin"jad.exe.
2、Directory for temporary files,這里設置臨時
文件路徑。
至于Window->Preferences->Java->JadClipse目錄下的Debug,Directives,Formatting,Misc目錄中的參數 設置,就不再羅嗦了。
(三)安裝完成后,eclipse沒有自動將JadClipse Class File Viewer設置成class文件的缺省打開方式。
如果沒有默認,可以在Eclipse的Windows—> Perference—>General->Editors->File Associations中修改“*.class”默認關聯的編輯器為“JadClipse Class File Viewer”。設置完成后,雙擊*.class文件,eclipse將自動反編譯。