2010-06-07 3 views
6

J'utilisais la méthode java.net.URL.openStream() pour extraire le contenu du serveur. J'ai récemment rencontré un problème où le code de réponse HTTP indiquait une erreur, mais au lieu de lancer une exception, le flux était toujours lu. Cela a causé l'erreur d'apparaître beaucoup plus tard dans l'exécution et s'est avéré être un faux-fuyant. Autant que je puisse voir, quand vous avez ouvert un flux en utilisant cette méthode, il n'y a aucun moyen de vérifier le code de réponse HTTP.Url.openStream est-il dangereux?

La seule façon que je pouvais trouver pour gérer ce bien était d'obtenir une connexion avant ouverture du flux:

HttpURLConnection conn=(HttpURLConnection) url.openConnection() 
#Code updated with scotth's suggestion 
if(!String.valueOf(conn.getResponseCode()).startsWith('2')) 
    throw new IOException("Incorrect response code "+conn.getResponseCode()+" Message: " +getResponseMessage()); 
rawIn=conn.getInputStream() 

InputStream in=conn.getInputStream() 

ne Vous êtes d'accord? Y a-t-il de bonnes raisons d'utiliser OpenStream en toute sécurité ou de décourager son utilisation? Il est à noter que Sun utilise la méthode dans leur tutorial code for reading directly from a URL. Là encore, le code lance Exception, donc ce n'est pas exactement un bastion de bonnes pratiques de codage.

Répondre

5

openStream() fonctionne très bien si vous voulez que votre classe soit à l'abri des changements dans le type d'URL - pour changer entre, par exemple, les chemins de fichiers absolus (fichier: ///), les ressources contenues protocoles peut-être même avec des gestionnaires de protocole personnalisés (scotth: //foo.bar). Toutefois, comme vous avez trouvé que son abstraction est assez élevée, si vous désirez en savoir plus sur la nature de l'interaction avec la ressource, vous devez utiliser le openConnection() et le lancer comme bon vous semble. Re: d'autres codes d'état - vous voulez probablement jeter un oeil à RFC2616 - si tout ce qui vous intéresse est "réussi", vous pouvez simplement vérifier que String.valueOf(conn.getResponseCode()).startsWith('2').

Questions connexes