在java中,如何根据url创建HttpsURLConnection或HttpURLConnection?

Ada*_*umb 13 java urlconnection

我正在开发一个项目,我正在创建一个类来运行http客户端请求(我的类充当客户端).它接受一个url和一个请求方法(GET,POST,PUT等),我希望能够解析URL并根据它是https还是http打开一个HttpsURLConnection或HttpURLConnection(假设给定的URL始终是正确).

如果我执行以下操作:

URLConnection conn = url.openConnection();
Run Code Online (Sandbox Code Playgroud)

然后,这将自动创建一个可以接受http和https的URLConnection,但如果我这样做,那么我找不到任何方法来设置请求方法(GET,POST等),因为只有HttpsURLConnection或HttpURLConnection类才有setRequestMethod方法.

如果我执行以下操作:

if(is_https)
    HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
else
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
Run Code Online (Sandbox Code Playgroud)

然后创建连接,但我无法在if块之外访问它们.

是否可以这样做,或者我应该放弃并使用apache httpclient类?

Rob*_*rco 32

HttpsURLConnection扩展了HttpUrlConnection,所以你不需要HttpsUrlConnection,你可以做

HttpURLConnection conn = (HttpURLConnection) url.openConnection();
Run Code Online (Sandbox Code Playgroud)


dfa*_*dfa 22

因为HttpsURLConnection extends HttpURLConnection你可以声明connHttpsURLConnection.通过这种方式,您可以访问公共接口(setRequestMethod()).

要访问扩展方法(例如getCipherSuite(),仅在子类中定义HttpsURLConnection),必须在instanceof之后使用强制转换:

if (conn instanceof HttpsURLConnection) {
    HttpsURLConnection secured = (HttpsURLConnection) conn;
    String cipher = secured.getCipherSuite();
}
Run Code Online (Sandbox Code Playgroud)