在同一个变量中支持HttpURLConnection和HttpsURLConnection?

时间:2012-08-01 16:00:56

标签: java http

我正在创建一个处理HTTP连接的类,我想处理HTTP和HTTPS,但是使用相同的变量(所以我可以使用相同的代码来发送数据等)。目前,我的代码看起来像什么像这样:

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方法?

2 个答案:

答案 0 :(得分:6)

保持conn URLConnection并在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中,您处理的是引用,而不是值。所以这里没有创建副本。

答案 1 :(得分:1)

试试这个:

((HttpsURLConnection) new URL(...).openConnection()).setHostnameVerifier(...);