2008-09-18 5 views
9

J'essaye d'écrire une servlet qui enverra un fichier XML (chaîne au format XML) à une autre servlet via un POST. (non essentiel du code de production xml remplacé par « Bonjour »)Ecriture de données de poste d'une servlet Java à une autre

StringBuilder sb= new StringBuilder(); 
    sb.append("Hello there"); 

    URL url = new URL("theservlet's URL"); 
    HttpURLConnection connection = (HttpURLConnection)url.openConnection();     
    connection.setRequestMethod("POST"); 
    connection.setRequestProperty("Content-Length", "" + sb.length()); 

    OutputStreamWriter outputWriter = new OutputStreamWriter(connection.getOutputStream()); 
    outputWriter.write(sb.toString()); 
    outputWriter.flush(); 
    outputWriter.close(); 

Cela provoque une erreur de serveur, et le second est servlet jamais invoqué.

Répondre

13

Ce genre de chose est beaucoup plus facile en utilisant une bibliothèque comme HttpClient. Il y a même un post XML code example:

PostMethod post = new PostMethod(url); 
RequestEntity entity = new FileRequestEntity(inputFile, "text/xml; charset=ISO-8859-1"); 
post.setRequestEntity(entity); 
HttpClient httpclient = new HttpClient(); 
int result = httpclient.executeMethod(post); 
2

Ne pas oublier d'utiliser:

connection.setDoOutput(true) 

si vous avez l'intention d'envoyer la sortie.

8

Je recommande d'utiliser Apache HTTPClient à la place, parce que c'est une API plus agréable.

Mais pour résoudre ce problème actuel: essayez d'appeler connection.setDoOutput(true); après avoir ouvert la connexion.

StringBuilder sb= new StringBuilder(); 
sb.append("Hello there"); 

URL url = new URL("theservlet's URL"); 
HttpURLConnection connection = (HttpURLConnection)url.openConnection();     
connection.setDoOutput(true); 
connection.setRequestMethod("POST"); 
connection.setRequestProperty("Content-Length", "" + sb.length()); 

OutputStreamWriter outputWriter = new OutputStreamWriter(connection.getOutputStream()); 
outputWriter.write(sb.toString()); 
outputWriter.flush(); 
outputWriter.close(); 
2

Le contenu d'un flux de téléchargement HTTP Post et la mécanique de celui-ci ne semblent pas être ce que vous les attendez d'être. Vous ne pouvez pas écrire un fichier en tant que contenu de publication, car POST a des normes RFC très spécifiques sur la manière dont les données incluses dans une requête POST sont supposées être envoyées. Ce n'est pas seulement le format du contenu lui-même, mais c'est aussi le mécanisme de la façon dont il est "écrit" dans le flux de sortie. Beaucoup de temps le POST est maintenant écrit en morceaux. Si vous regardez le code source de HTTPClient d'Apache, vous verrez comment il écrit les morceaux.

Il y a des problèmes avec la longueur du contenu comme résultat, parce que la longueur du contenu est augmentée par un petit nombre identifiant le morceau et une petite séquence aléatoire de caractères qui délimite chaque morceau comme il est écrit sur le flux. Regardez quelques-unes des autres méthodes décrites dans les versions plus récentes de Java de la connexion HTTPURLConnection.

http://java.sun.com/javase/6/docs/api/java/net/HttpURLConnection.html#setChunkedStreamingMode(int)

Si vous ne savez pas ce que vous faites et ne veulent pas apprendre, traiter avec l'ajout d'une dépendance comme Apache HTTPClient ne vraiment finir par être beaucoup plus facile car elle encapsule toute la complexité et fonctionne juste.

Questions connexes