В Java, как создать HttpsURLConnection или HttpURLConnection на основе URL? - PullRequest
13 голосов
/ 03 июня 2009

Я работаю над проектом, в котором я создаю класс для выполнения запросов HTTP-клиентов (мой класс действует как клиент). Он принимает URL-адрес и метод запроса (GET, POST, PUT и т. Д.), И я хочу иметь возможность проанализировать URL-адрес и открыть HttpsURLConnection или HttpURLConnection на основе того, является ли это https или http (предположим, что указанные URL-адреса всегда будут правильно).

Если я сделаю следующее:

URLConnection conn = url.openConnection();

Тогда это автоматически создаст URLConnection, который может принимать как http, так и https, но если я сделаю это, я не смогу найти способ установить метод запроса (GET, POST и т. Д.), Поскольку только HttpsURLConnection или HttpURLConnection классы имеют метод setRequestMethod.

Если я сделаю что-то вроде следующего:

if(is_https)
    HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
else
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();

Затем создаются соединения, но я не могу получить к ним доступ за пределами блоков if.

Возможно ли это сделать, или я должен просто отказаться от использования классов Apache httpclient?

Ответы [ 2 ]

32 голосов
/ 03 июня 2009

HttpsURLConnection extends HttpUrlConnection , поэтому вам не нужен HttpsUrlConnection, вы можете просто сделать

HttpURLConnection conn = (HttpURLConnection) url.openConnection();
21 голосов
/ 03 июня 2009

с HttpsURLConnection extends HttpURLConnection вы можете объявить conn как HttpsURLConnection. Таким образом, вы можете получить доступ к общему интерфейсу (setRequestMethod()).

Чтобы получить доступ к методам расширения (например, getCipherSuite(), определенным только в дочернем классе HttpsURLConnection), вы должны использовать приведение после instanceof :

if (conn instanceof HttpsURLConnection) {
    HttpsURLConnection secured = (HttpsURLConnection) conn;
    String cipher = secured.getCipherSuite();
}
...