Question

J'essaie d'écrire une servlet qui enverra un fichier XML (chaîne au format xml) à une autre servlet via un POST. (Le code de génération xml non essentiel a été remplacé par "Bonjour,")

   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 servlet n'est jamais appelé.

Était-ce utile?

La solution

Ce genre de choses est beaucoup plus facile avec une bibliothèque telle que HttpClient . Il existe même un exemple de code XML :

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);

Autres conseils

Je recommande d'utiliser plutôt Apache HTTPClient , car 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();

Le contenu d'un flux de publication HTTP et ses mécanismes ne semblent pas correspondre à ce que vous attendez d'eux. Vous ne pouvez pas simplement écrire un fichier en tant que contenu de publication, car le POST a des normes RFC très spécifiques sur la manière dont les données incluses dans une demande POST sont censé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". à la sortie. Beaucoup de temps, POST est maintenant écrit en morceaux. Si vous regardez le code source du HTTPClient d’Apache, vous verrez comment il écrit les morceaux.

Il y a des bizarreries avec la longueur du contenu comme résultat, car la longueur du contenu est augmentée d'un petit nombre identifiant le bloc et d'une petite séquence aléatoire de caractères qui délimitent chaque bloc au fur et à mesure de son écriture dans le flux. Regardez certaines des autres méthodes décrites dans les versions Java plus récentes de 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 que vous ne voulez pas l'apprendre, gérer l'ajout d'une dépendance comme Apache HTTPClient finit par être beaucoup plus simple, car cela résume toute la complexité et fonctionne parfaitement.

N'oubliez pas d'utiliser:

connection.setDoOutput( true)

si vous envisagez d'envoyer une sortie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top