2009-06-03 9 views
11

Sto lavorando a un progetto in cui sto creando una classe per eseguire richieste di client http (la mia classe funge da client). Include un url e un metodo di richiesta (GET, POST, PUT, ecc.) E voglio essere in grado di analizzare l'URL e aprire un HttpsURLConnection o HttpURLConnection in base al fatto che sia https o http (si presuma che gli url dati siano sempre corretta).In java, come creare HttpsURLConnection o HttpURLConnection in base all'URL?

Se faccio la seguente:

URLConnection conn = url.openConnection(); 

Poi che creerà automaticamente un URLConnection che può accettare HTTP e HTTPS, ma se faccio questo, allora non riesco a trovare un modo per impostare un metodo di richiesta (GET, POST, ecc.), Poiché solo le classi HttpsURLConnection o HttpURLConnection hanno il metodo setRequestMethod.

Se faccio qualcosa di simile al seguente:

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

Poi vengono creati i collegamenti, ma non posso accedere al di fuori dei se i blocchi.

È possibile eseguire questa operazione o devo semplicemente rinunciare e utilizzare le classi httpclient di apache?

+5

Basta definire * conn * prima del * se * dichiarazione. Hai bisogno di leggere su scope variabile. – user359996

risposta

28

HttpsURLConnection estende HttpUrlConnection, quindi non è necessario il HttpsURLConnection, si può solo fare

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

I problemi si manifestano in un'epoca in cui HTTPS sta diventando sempre più necessario. –

+0

Sì, questo sta sfruttando il polimorfismo Java. JVM chiamerà il metodo dalla classe appropriata quando usa tale conn. Quindi digitare il controllo come se (is_https) non avesse senso in questo caso. https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html – kiedysktos

19

dal HttpsURLConnection extends HttpURLConnection è possibile dichiarare conn come HttpsURLConnection. In questo modo è possibile accedere all'interfaccia comune (setRequestMethod()).

Per poter accedere ai metodi di estensione (come getCipherSuite(), definita solo nella classe figlia HttpsURLConnection) è necessario utilizzare un cast dopo un instanceof:

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