125 votes

FileNotFoundException lors de l'obtention de l'objet InputStream à partir de HttpURLConnection

J'essaie d'envoyer une requête post vers une url à l'aide de HttpURLConnection (pour l'utilisation de cUrl en java). Le contenu de la demande est le xml et le point de fin, le processus de demande xml et stocke un enregistrement de la base de données et renvoie une réponse en forme de chaîne de caractères xml. L'application est hébergée sur un serveur apache-tomcat localement.

Lorsque j'exécute ce code à partir du terminal, une ligne est ajoutée à la db comme prévu. Mais une exception est levée comme suit lors de l'obtention de l'InputStream à partir de la connexion

java.io.FileNotFoundException: http://localhost:8080/myapp/service/generate
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1401)
    at org.kodeplay.helloworld.HttpCurl.main(HttpCurl.java:30)

Voici le code

public class HttpCurl {
    public static void main(String [] args) {

        HttpURLConnection con;

        try {
            con = (HttpURLConnection) new URL("http://localhost:8080/myapp/service/generate").openConnection();
            con.setRequestMethod("POST");
            con.setDoOutput(true);
            con.setDoInput(true);

            File xmlFile = new File("test.xml");

            String xml = ReadWriteTextFile.getContents(xmlFile);                

            con.getOutputStream().write(xml.getBytes("UTF-8"));
            InputStream response = con.getInputStream();

            BufferedReader reader = new BufferedReader(new InputStreamReader(response));
            for (String line ; (line = reader.readLine()) != null;) {
                System.out.println(line);
            }
            reader.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
  }

Sa confusion, car l'exception est tracé pour la ligne InputStream response = con.getInputStream(); et il ne semble pas être n'importe quel fichier d'un FileNotFoundException.

Lorsque j'essaie d'ouvrir une connexion à un fichier xml directement, il ne jette pas cette exception.

Le service app utilise le framework spring et Jaxb2Marshaller pour créer le fichier xml de réponse.

La classe ReadWriteTextFile est prise à partir d' ici

Merci.

Edit: Eh bien, il enregistre les données dans la base de données et renvoie une erreur 404 code d'état de réponse en même temps.

J'ai aussi essayé de faire une boucle à l'aide de php et d'imprimer l' CURLINFO_HTTP_CODE qui s'avère être 200.

Des idées sur comment dois-je aller sur le débogage ? À la fois le service et le client sont sur le serveur local.

Résolu: J'ai pu résoudre le problème après avoir fait référence à une réponse sur tant de lui-même.

Il semble HttpURLConnection renvoie toujours la réponse 404 lors de la connexion à une url avec un port non standard.

L'ajout de ces lignes résolu

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

142voto

BalusC Points 498232

Je ne sais pas à propos de votre Printemps/JAXB combinaison, mais la moyenne RESTE webservice ne reviendra pas un corps de réponse sur le POST/PUT, juste un état de réponse. Vous souhaitez afin de déterminer la place du corps.

Remplacer

InputStream response = con.getInputStream();

par

int status = con.getResponseCode();

Disponible tous les codes d'état et leur signification sont disponibles dans la spécification HTTP, comme avant. Le webservice lui-même devrait également venir avec une partie de la documentation qui aperçus de tous les codes d'état soutenu par le webservice et leur signification spéciale, le cas échéant.

Si l'état commence par 4nn ou 5nn, vous souhaitez utiliser getErrorStream() au lieu de lire le corps de la réponse qui peut contenir les détails de l'erreur.

InputStream error = con.getErrorStream();

57voto

Jon Skeet Points 692016

FileNotFound est simplement une exception malheureuse utilisée pour indiquer que le serveur Web a renvoyé un 404.

34voto

Chowza Points 976

À personne avec ce problème à l'avenir, la raison en est que le code de statut a été une erreur 404 (ou dans mon cas était de 500). Il semble que l' InpuStream de la fonction renvoie une erreur lorsque le code d'état n'est pas 200.

Dans mon cas, j'ai le contrôle de mon propre serveur et retournait un 500 code d'état pour indiquer une erreur s'est produite. Malgré moi, également, l'envoi d'un corps avec une chaîne de message détaillant l'erreur, l' inputstream a jeté une erreur quel que soit le corps étant complètement lisible.

Si vous contrôlez votre serveur je suppose que cela peut être manipulé par l'envoi d'-vous un code d'état 200 puis sur la gestion quelle que soit l'erreur de chaîne de réponse a été.

6voto

zero0cool Points 128

Pour quelqu'un d'autre de buter sur ce, la même chose m'est arrivé, tout en essayant d'envoyer une requête SOAP à la tête d'un service SOAP. La question était un faux ordre dans le code, j'ai demandé le flux d'entrée avant de l'envoyer le corps XML. Dans le code à l'aide de l'extrait ci-dessous, la ligne InputStream in = conn.getInputStream(); venu immédiatement après l' ByteArrayOutputStream out = new ByteArrayOutputStream(); qui est le mauvais ordre des choses.

ByteArrayOutputStream out = new ByteArrayOutputStream();
// send SOAP request as part of HTTP body 
byte[] data = request.getHttpBody().getBytes("UTF-8");
conn.getOutputStream().write(data); 

if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
  Log.d(TAG, "http response code is " + conn.getResponseCode());
  return null;
}

InputStream in = conn.getInputStream();

FileNotFound dans ce cas était un malheureux façon de coder code de réponse HTTP 400.

4voto

tofarr Points 2069

FileNotFound dans ce cas signifie que vous avez reçu un 404 de votre serveur - est-ce que le serveur n'aime pas les requêtes "POST"?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X