2012-08-01 78 views
3

我正在創建一個處理HTTP連接的類,我想處理HTTP和HTTPS,但使用相同的變量(所以我可以使用相同的代碼發送數據等)。目前,我的代碼看起來像這樣的:在同一變量中同時支持HttpURLConnection和HttpsURLConnection?

if (ssl) 
{ 
    conn = (HttpsURLConnection) new URL(...).openConnection(); 
    conn.setHostnameVerifier(...); 
} 
else 
{ 
    conn = (HttpURLConnection) new URL(...).openConnection(); 
} 

當 「參數conn」 的類型是HttpsURLConnection的中,HttpURLConnection的轉換失敗。當「conn」類型爲HttpURLConnection或URLConnection時,「setHostnameVerifier」和其他HTTPS相關方法無法訪問。

鑑於HttpsURLConnection是HttpURLConnection類的一個子類,所以我認爲將它投射會有效,但我顯然是錯誤的。有什麼方法可以使代碼正常工作,以便在需要時可以訪問HTTPS方法?

+0

在大多數情況下,你應該保持默認的主機名驗證反正。 – Bruno 2012-08-01 16:08:28

回答

5

只要保留connURLConnection並在if塊中創建更具體的本地參考。

URLConnection conn; 

// ... 

conn = new URL(...).openConnection(); 

// ... 

if (conn instanceof HttpsURLConnection) { 
    HttpsURLConnection httpsConn = (HttpsURLConnection) conn; 
    httpsConn.setHostnameVerifier(...); 
} 

// ... 

或只是

// ... 

if (conn instanceof HttpsURLConnection) { 
    ((HttpsURLConnection) conn).setHostnameVerifier(...); 
} 

// ... 

請記住,在Java中,你正在處理的參考,而不是與價值。所以這裏沒有創建副本。

+0

謝謝。我正在嘗試類似你給出的第二個例子,但顯然我必須在錯誤的地方得到括號。 – Rsaesha 2012-08-01 16:12:50

1

試試這個:

((HttpsURLConnection) new URL(...).openConnection()).setHostnameVerifier(...); 
相關問題