2009-06-02 14 views
23

J'essayais d'utiliser Apache Ant Get task pour obtenir la liste des WSDL générés par une autre équipe de notre société. Ils les ont hébergés sur un serveur weblogic 9.x au http://....com:7925/services/. Je suis capable d'accéder à la page via un navigateur, mais la tâche get me donne une exception FileNotFoundException en essayant de copier la page dans un fichier local pour analyser. J'étais encore capable d'obtenir (en utilisant la tâche ant) ​​une URL sans le port non standard 80 pour HTTP. J'ai regardé à travers le code source Ant, et réduit l'erreur à la connexion URLConnection. Il semble que le URLConnection ne reconnaisse pas les données dans le trafic HTTP, puisqu'il ne se trouve pas sur le port standard, même si le protocole est spécifié comme HTTP. J'ai reniflé le trafic en utilisant WireShark et la page se charge correctement sur le fil, mais obtient toujours l'exception FileNotFoundException.URLConnection FileNotFoundException pour les sources de port HTTP non standard

Voici un exemple où vous verrez l'erreur (avec l'URL modifiée pour protéger l'innocent). L'erreur est renvoyée sur connection.getInputStream();

import java.io.File; 
import java.io.InputStream; 
import java.net.URL; 
import java.net.URLConnection; 

    public class TestGet { 
    private static URL source; 
    public static void main(String[] args) { 
     doGet(); 
    } 
    public static void doGet() { 
      try { 
      source = new URL("http", "test.com", 7925, 
        "/services/index.html"); 
      URLConnection connection = source.openConnection(); 
      connection.connect(); 
      InputStream is = connection.getInputStream(); 
     } catch (Exception e) { 
      System.err.println(e.toString()); 
     } 
    } 

} 
+0

Maintenant, je suppose que c'est un type mais votre lien est au port 7924 et votre code porte sur le port 7925 – Gandalf

+0

Yup, c'était une faute de frappe, corrigé maintenant, merci. – jeffl8n

Répondre

7

de vérifier le code de réponse étant renvoyé par le serveur

+0

Le serveur que je suis en train de tester me donne un code d'état 200. – jeffl8n

+0

Comment vérifiez-vous cela? – objects

+0

Je vérifiais avec Firefox. Vous avez raison, cependant. Le problème était que le serveur renvoyait un code 404 au code Java, mais affichait ensuite l'index des WSDL disponibles et répondait ainsi avec un code d'état 200 OK à Firefox. Je pense que c'est le comportement par défaut pour XFire d'afficher la liste des WSDL chaque fois qu'il y a une erreur 404. – jeffl8n

0

Je l'ai essayé sur place - en utilisant le code fourni - et je ne suis pas un FileNotFoundException sauf lorsque le serveur renvoie une réponse d'état 404. Etes-vous sûr de vous connecter au serveur Web auquel vous souhaitez vous connecter? Y a-t-il une chance que vous vous connectiez à un serveur Web différent? (Je note que le numéro de port dans le code ne correspond pas au numéro de port dans le lien)

+0

Le serveur que je suis en train de tester me donne un code d'état de 200. L'exemple de code ci-dessus n'a pas d'URL valide car je ne connaissais pas de serveur HTTP public non-port 80. – jeffl8n

+1

402 a également donné cette exception. – Pijusn

+0

Aussi 503 donne cette exception (le mien fait par une protection anti-DDoS) –

19

Ceci est un vieux fil, mais j'eu un problème similaire et trouvé une solution qui n'est pas répertoriée ici.

Je recevais la page bien dans le navigateur, mais j'ai obtenu un 404 lorsque j'ai essayé d'y accéder via le HttpURLConnection. L'URL à laquelle j'essayais d'accéder contenait un numéro de port. Lorsque je l'ai essayé sans le numéro de port, j'ai réussi à obtenir une page factice via le HttpURLConnection. Donc, il semblait que le port non-standard était le problème. J'ai commencé à penser que l'accès était restreint et, dans un sens, c'était le cas. Ma solution était que je devais dire au serveur l'utilisateur-agent et je spécifie également les types de fichiers que je m'attends. J'essaie de lire un fichier .json, donc j'ai pensé que le type de fichier pourrait aussi être une spécification nécessaire.

j'ajouté ces lignes et il a finalement travaillé:

httpConnection.setRequestProperty("User-Agent","Mozilla/5.0 (compatible) "); 
httpConnection.setRequestProperty("Accept","*/*"); 
+0

Merci beaucoup, ça marche! –

+0

C'était exactement le problème auquel je faisais face. Votre solution a aidé. Merci beaucoup. – naiquevin

44

La réponse à ma requête HTTP retourné avec un code d'état 404, ce qui a entraîné une FileNotFoundException quand j'ai appelé getInputStream(). Je voulais toujours lire le corps de la réponse, donc j'ai dû utiliser une autre méthode: HttpURLConnection # getErrorStream().

Voici un extrait de JavaDoc de getErrorStream():

Renvoie le flux d'erreur si la connexion échoué, mais le serveur a envoyé des données utiles néanmoins. L'exemple typique est lorsqu'un serveur HTTP répond avec un 404, ce qui entraînera une FileNotFoundException d'être jeté dans de connexion, mais le serveur a envoyé une page d'aide HTML avec des suggestions pour quoi faire.

Exemple d'utilisation:

public static String httpGet(String url) { 
    HttpURLConnection con = null; 
    InputStream is = null; 
    try { 
     con = (HttpURLConnection) new URL(url).openConnection(); 
     con.connect(); 

     //4xx: client error, 5xx: server error. See: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html. 
     boolean isError = con.getResponseCode() >= 400; 
     //In HTTP error cases, HttpURLConnection only gives you the input stream via #getErrorStream(). 
     is = isError ? con.getErrorStream() : con.getInputStream(); 

     String contentEncoding = con.getContentEncoding() != null ? con.getContentEncoding() : "UTF-8"; 
     return IOUtils.toString(is, contentEncoding); //Apache Commons IO 
    } catch (Exception e) { 
     throw new IllegalStateException(e); 
    } finally { 
     //Note: Closing the InputStream manually may be unnecessary, depending on the implementation of HttpURLConnection#disconnect(). Sun/Oracle's implementation does close it for you in said method. 
     if (is != null) { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       throw new IllegalStateException(e); 
      } 
     } 
     if (con != null) { 
      con.disconnect(); 
     } 
    } 
} 
+0

c'était utile, mais c'est juste une vague page d'erreur 400. J'utilise https://graph.facebook.com/me/photos et dans le navigateur cela fonctionne à moins que vous n'essayiez d'afficher les en-têtes via l'addon du développeur Web. Donc, il semble que l'inputtream crée une nouvelle requête d'une façon ou d'une autre, ce qui n'a aucun sens ... plus de temps pour s'en rendre compte ... merci pour le conseil de geterrorstream. – Brenden

+1

Cela fonctionne. Vérifiez le code de réponse, puis getErrorStream() ou getInputStream() en conséquence. L'extrait de code doit être fourni dans ce cas. – Emerald214

+0

vérifier le code de réponse m'a beaucoup aidé. maintenant je ne trouve pas FileNotFoundException..thanks @bcody –

2

Je sais que c'est un vieux fil mais j'ai trouvé une solution ne figure nulle part ici.

J'essayais de tirer des données au format json à partir d'une servlet J2EE sur le port 8080 mais recevait l'erreur de fichier introuvable. J'ai été capable de tirer ces mêmes données json d'un serveur php fonctionnant sur le port 80.

Il s'est avéré que dans le servlet, j'avais besoin de changer doGet en doPost.

Espérons que cela aide quelqu'un.

0

J'ai couru un problème similaire mais la raison semble être différente, voici la trace d'exception:

java.io.FileNotFoundException: http://myhost1:8081/test/api?wait=1 
    at sun.reflect.GeneratedConstructorAccessor2.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1491) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1485) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1139) 
    at com.doitnext.loadmonger.HttpExecution.getBody(HttpExecution.java:85) 
    at com.doitnext.loadmonger.HttpExecution.execute(HttpExecution.java:214) 
    at com.doitnext.loadmonger.ClientWorker.run(ClientWorker.java:126) 
    at java.lang.Thread.run(Thread.java:680) 
Caused by: java.io.FileNotFoundException: http://myhost1:8081/test/api?wait=1 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1434) 
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379) 
    at com.doitnext.loadmonger.HttpExecution.execute(HttpExecution.java:166) 
    ... 2 more 

Il semblerait que juste obtenir le code de réponse provoquera la connexion URL à callGetInputStream.

+2

J'ai corrigé le problème en lançant HttpUrlConnection et en utilisant Apache HttpClient à la place. Meilleure performance et code beaucoup plus propre. –

0

Je sais que c'est un vieux fil mais juste remarqué quelque chose sur celui-ci alors j'ai pensé que je vais le mettre là-bas.

Comme Jessica mentionné, cette exception est levée lors de l'utilisation de port non standard.

Cela semble seulement se produire lors de l'utilisation de DNS. Si j'utilise le numéro IP, je peux spécifier le numéro de port et tout fonctionne bien.