2009-06-03 8 views
11

Je travaille sur un projet où je crée une classe pour exécuter des requêtes client http (ma classe agit en tant que client). Il prend une url et une méthode de demande (GET, POST, PUT, etc) et je veux être en mesure d'analyser l'URL et d'ouvrir un HttpsURLConnection ou HttpURLConnection basé sur s'il s'agit de https ou http (supposons que les URL donnés seront toujours correct).En Java, comment créer HttpsURLConnection ou HttpURLConnection basé sur l'URL?

Si je fais ce qui suit:

URLConnection conn = url.openConnection(); 

Ensuite, qui crée automatiquement un URLConnection qui peut accepter les deux http et https, mais si je fais cela, je ne peux donc pas trouver un moyen de définir une méthode de demande (GET, POST, etc), puisque seules les classes HttpsURLConnection ou HttpURLConnection ont la méthode setRequestMethod.

Si je fais quelque chose comme ce qui suit:

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

Ensuite, les connexions sont créées, mais je ne peux pas y accéder en dehors des blocs si.

Est-il possible de faire cela, ou devrais-je simplement abandonner et utiliser les classes apache httpclient?

+5

définir simplement * conn * avant * si * déclaration. Vous devez lire sur une portée variable. – user359996

Répondre

28

HttpsURLConnection étend HttpUrlConnection, de sorte que vous n'avez pas besoin HttpsURLConnection, vous pouvez juste faire

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

Des problèmes se manifestent avec cela à une époque où HTTPS devient de plus en plus nécessaire. –

+0

Oui, cela profite du polymorphisme Java. JVM appelle la méthode de la classe appropriée lors de l'utilisation de ce conn. Donc taper check comme si (is_https) n'a pas de sens dans ce cas. https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html – kiedysktos

19

depuis HttpsURLConnection extends HttpURLConnection vous pouvez déclarer conn comme HttpsURLConnection. De cette façon, vous pouvez accéder à l'interface commune (setRequestMethod()).

Pour accéder aux méthodes d'extension (comme getCipherSuite(), défini seulement dans la classe enfant HttpsURLConnection), vous devez utiliser un plâtre après une instanceof:

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