2008-09-18 11 views
9

Ich versuche, ein Servlet zu schreiben, das eine XML-Datei (XML-formatierter String) über einen POST an ein anderes Servlet sendet. (Non wesentliche Code xml Erzeugungs mit „Hallo“ ersetzt) ​​Post-Daten von einem Java-Servlet zu einem anderen schreiben

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

Dies verursacht einen Serverfehler, und das zweite Servlet nie aufgerufen.

Antwort

13

Diese Art der Sache ist viel einfacher, eine Bibliothek wie HttpClient verwenden. Es gibt sogar eine 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

Vergessen Sie nicht zu verwenden:

connection.setDoOutput(true) 

, wenn Sie auf Senden der Ausgabe beabsichtigen.

8

Ich empfehle stattdessen Apache HTTPClient, weil es eine schönere API ist.

Aber um dieses aktuelle Problem zu lösen: versuchen Sie connection.setDoOutput(true); nach dem Öffnen der Verbindung.

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

Der Inhalt einer HTTP-Post-Upload-Datenstrom und die Mechanik der es scheinen nicht zu sein, was Sie erwarten, sie zu sein. Sie können nicht einfach eine Datei als Post-Inhalt schreiben, da POST sehr spezifische RFC-Standards hat, wie die Daten in einer POST-Anfrage gesendet werden sollen. Es ist nicht nur das Format des Inhalts selbst, sondern auch die Mechanik, wie es in den Ausgabestrom "geschrieben" wird. Viele der Zeit POST ist jetzt in Blöcken geschrieben. Wenn Sie sich den Quelltext von Apache HTTPClient anschauen, sehen Sie, wie er die Chunks schreibt.

Es gibt Macken mit der Inhaltslänge als Ergebnis, weil die Inhaltslänge um eine kleine Zahl erhöht wird, die den Chunk und eine zufällige kleine Zeichenfolge kennzeichnet, die jeden Chunk abgrenzt, wenn er über den Stream geschrieben wird. Sehen Sie sich einige der anderen Methoden an, die in neueren Java-Versionen von HTTPURLConnection beschrieben werden.

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

Wenn Sie nicht wissen, was Sie tun und wollen nicht, es lernen, mit dem Umgang eine Abhängigkeit wie Apache Httpclient Hinzufügen wirklich viel einfacher sind nicht am Ende, weil es die ganze Komplexität abstrahiert und funktioniert einfach.

Verwandte Themen