3

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 メソッドにアクセスできるように、このコードを機能させる方法はありますか?

4

2 に答える 2

7

を保持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 では、値ではなく参照を扱っていることに注意してください。したがって、ここではコピーは作成されません。

于 2012-08-01T16:05:26.520 に答える
1

これを試して:

((HttpsURLConnection) new URL(...).openConnection()).setHostnameVerifier(...);
于 2012-08-01T16:06:19.183 に答える