2009-06-03 5 views
11

Pracuję nad projektem, w którym tworzę klasę do uruchamiania żądań klienta HTTP (moja klasa działa jako klient). Przyjmuje adres URL i metodę żądania (GET, POST, PUT, itp.) I chcę mieć możliwość przeanalizowania adresu URL i otwarcia połączenia HttpsURLConnection lub HttpURLConnection na podstawie tego, czy jest to https, czy http (zakładam, że podane adresy URL będą zawsze poprawny).W języku java, jak utworzyć HttpsURLConnection lub HttpURLConnection na podstawie adresu URL?

Gdybym wykonaj następujące czynności:

URLConnection conn = url.openConnection(); 

Wtedy to automatycznie utworzy URLConnection że może przyjąć zarówno HTTP i HTTPS, ale jeśli mogę to zrobić to nie mogę znaleźć żadnego sposobu, aby ustawić metodę żądania (GET, POST, itp.), Ponieważ tylko klasy HttpsURLConnection lub HttpURLConnection mają metodę setRequestMethod.

Jeśli robię coś jak następuje:

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

Następnie połączenia są tworzone, ale nie można uzyskać do nich dostęp poza if bloków.

Czy można to zrobić, czy powinienem po prostu zrezygnować i użyć klas apache httpclient?

+5

Wystarczy zdefiniować * conn * przed * jeśli * komunikat. Musisz przeczytać o zakresie zmiennym. – user359996

Odpowiedz

28

HttpsURLConnection rozciąga HttpUrlConnection, więc nie trzeba się HttpsUrlConnection, można po prostu zrobić

HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
+1

Problemy pojawiają się z tym w czasach, gdy HTTPS staje się coraz bardziej potrzebny. –

+0

Tak, to korzysta z polimorfizmu Java. JVM wywoła metodę z odpowiedniej klasy podczas używania takiego połączenia. Więc wpisywanie sprawdzania, czy (is_https) nie ma sensu w tym przypadku. https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html – kiedysktos

19

od HttpsURLConnection extends HttpURLConnection można zadeklarować conn jak HttpsURLConnection. W ten sposób można uzyskać dostęp do wspólnego interfejsu (setRequestMethod()).

W celu uzyskania dostępu do metod rozszerzenia (jak getCipherSuite(), zdefiniowany tylko w klasie dziecko HttpsURLConnection) należy użyć obsady po przeprowadzeniu instanceof:

if (conn instanceof HttpsURLConnection) { 
    HttpsURLConnection secured = (HttpsURLConnection) conn; 
    String cipher = secured.getCipherSuite(); 
} 
Powiązane problemy