2010-06-29 3 views
2

Je rencontre des problèmes lors de l'envoi de données XML à l'aide d'HTTP POST à ​​une API.Problème lié à l'envoi de données XML à une API à l'aide de Java

Si j'envoie XML bien formaté, je reçois un message d'erreur:

serveur Exception: ne peut pas accéder à un fermé flux

Si le XML est pas bien formaté, je reçois HTTP 500. Et si je viens d'envoyer une chaîne vide au lieu d'une chaîne avec XML, je reçois un message d'erreur: EMPTY REQUEST.

Je n'ai pas beaucoup d'idées sur ce que l'erreur pourrait être, mais la connexion fonctionne parce que le message d'erreur est retourné au format XML. Je ne fais qu'envoyer les données XML sous forme de chaîne. Est-il possible que je doive envoyer un EOF ou quelque chose à la fin? Et comment puis-je faire cela dans mon code Java? D'autres idées sur ce que le problème peut être?

L'API est faite dans .NET

est le code Java I Ici je utilise pour afficher les données XML:

Authenticator.setDefault(new MyAuthenticator()); 
    String xmlRequestStatus = 
    "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><test><data>32</data></test>"; 
    System.out.println(xmlRequestStatus); 
    String contentType = "text/xml"; 
    String charset = "ISO-8859-1"; 
    String request = null; 
    URL url = null; 
    HttpURLConnection connection = null; 
    OutputStream output = null; 
    InputStream response = null; 
    try { 
    url = new URL("http://127.0.0.1/test"); 
    } catch (MalformedURLException e) { 
    e.printStackTrace(); 
    } 

    try { 
    connection = (HttpURLConnection)url.openConnection(); 
    connection.setDoOutput(true); 
    connection.setRequestMethod("POST"); 
    connection.setRequestProperty("Accept-Charset", charset); 
    connection.setRequestProperty("Content-Type", contentType); 
    output = connection.getOutputStream(); 
    output.write(request.getBytes("ISO-8859-1")); 
    if(output != null) try { output.close(); } catch (IOException e) {} 

    response = connection.getInputStream(); 
     .... 

Répondre

1

Cela semble bien et devrait fonctionner correctement. Le connection.setRequestMethod("POST"); est cependant entièrement superflu lorsque vous l'avez déjà fait connection.setDoOutput(true);.

Puisque cette erreur provient directement du service Web .NET hébergé chez localhost, êtes-vous sûr qu'il est écrit sans bugs? Je ne fais pas .NET, mais Google m'apprend qu'il est lié à MemoryStream. Je me concentrerais sur le code .NET et le retesterais/déboguerais. Peut-être que ces related SO questions peuvent aider.

0

Vous devez spécifier la méthode POST en faisant quelque chose comme ça,

connection.setRequestMethod("POST"); 
connection.setRequestProperty("Content-Length", "" + length); 

Sinon, il est traité comme un GET et certains serveurs n'attendent pas de corps avec GET afin que le flux soit fermé.

+0

Merci, j'ai ajouté cela, mais j'ai eu le même problème. J'utilise le code de cette réponse: http://stackoverflow.com/questions/2793150/how-to-use-java-net-urlconnection-to-fire-and-handle-http-requests/2793153#2793153 – Jonas

0

Peut-être fermer le OutputStream plus tard dans le flux de contrôle. Donc, au lieu de cela:

output.write(request.getBytes("ISO-8859-1")); 
if(output != null) try { output.close(); } catch (IOException e) {} 

response = connection.getInputStream(); 

Essayez ceci (et ajoutez peut-être le flush)?

output.write(request.getBytes("ISO-8859-1")); 
output.flush(); 
response = connection.getInputStream(); 

if(output != null) try { output.close(); } catch (IOException e) {} 
+0

Merci, mais ça n'a pas aidé :( – Jonas

0

ne devrait-il être &lt;32 au lieu de <32?

+0

Ah, c'était juste une faute de frappe de ma part, désolé, j'ai mis à jour ma question maintenant, j'ai le même message d'erreur. – Jonas

0

Il semble que la requête soit initialisée à null, mais qu'elle ne soit pas définie par la suite. Ne devrait-il pas être

output.write(xmlRequestStatus.getBytes("ISO-8859-1")); 
Questions connexes