2009-06-03 42 views
11

Estoy trabajando en un proyecto en el que estoy creando una clase para ejecutar solicitudes de clientes http (mi clase actúa como cliente). Se necesita de una URL y un método de petición (GET, POST, PUT, etc.) y quiero ser capaz de analizar la URL y abrir una HttpsURLConnection o HttpURLConnection en función de si es https o http (asumen las URL dadas serán siempre correcto).En java, ¿cómo crear HttpsURLConnection o HttpURLConnection en función de la url?

Si hago lo siguiente:

URLConnection conn = url.openConnection(); 

Luego que creará automáticamente una URLConnection que puede aceptar HTTP y HTTPS, pero si hago esto, entonces no puedo encontrar ninguna manera de establecer un método de petición (GET, POST, etc.), ya que solo las clases HttpsURLConnection o HttpURLConnection tienen el método setRequestMethod.

Si hago algo como lo siguiente:

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

A continuación, las conexiones se crean, pero no puedo acceder a ellos fuera de los bloques si.

¿Es posible hacer esto, o debo renunciar y utilizar las clases Apache HttpClient?

+5

Simplemente defina * conexion * antes de que el * si * declaración. Necesitas leer acerca del alcance variable. – user359996

Respuesta

28

HttpsURLConnection se extiende HttpUrlConnection, por lo que no es necesario el HttpsURLConnection, sólo puede hacer

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

Los problemas rezuman con esto en una era en la que HTTPS es cada vez más necesario. –

+0

Sí, esto está aprovechando el polimorfismo de Java. JVM llamará al método de la clase apropiada cuando use dicha conexión. Por lo tanto, escribir el tipo de verificación como si (is_https) no tiene sentido en este caso. https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html – kiedysktos

19

desde HttpsURLConnection extends HttpURLConnection se puede declarar como connHttpsURLConnection. De esta forma, puede acceder a la interfaz común (setRequestMethod()).

Con el fin de acceder a los métodos de extensión (como getCipherSuite(), que se define sólo en la clase hija HttpsURLConnection) tiene que usar un yeso después de una instanceof:

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