В java, как создать HttpsURLConnection или HttpURLConnection на основе URL-адреса?

Я работаю над проектом, в котором я создаю класс для запуска 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?


person Adam Plumb    schedule 03.06.2009    source источник
comment
Просто определите conn перед оператором if. Вам нужно прочитать о области видимости переменных.   -  person user359996    schedule 06.12.2010


Ответы (2)


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

HttpURLConnection conn = (HttpURLConnection) url.openConnection();
person Rob Di Marco    schedule 03.06.2009
comment
Проблемы с этим возникают в эпоху, когда HTTPS становится все более востребованным. - person Ky Leggiero; 12.05.2016
comment
Да, это использует преимущества полиморфизма Java. JVM будет вызывать метод из соответствующего класса при использовании такого соединения. Так что проверка типа if(is_https) в данном случае не имеет смысла. docs.oracle.com/javase/tutorial/java/IandI/полиморфизм. html - person kiedysktos; 23.05.2016

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

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

if (conn instanceof HttpsURLConnection) {
    HttpsURLConnection secured = (HttpsURLConnection) conn;
    String cipher = secured.getCipherSuite();
}
person dfa    schedule 03.06.2009