Schreiben von Post-Daten von einem Java-Servlet zu einem anderen

Ich versuche, ein Servlet zu schreiben, das eine XML-Datei (XML-formatierte Zeichenfolge) über einen POST an ein anderes Servlet sendet. (Nicht essentieller XML-Generierungscode ersetzt durch "Hallo da")

   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 wird nie aufgerufen.

0
hinzugefügt
Ansichten: 3

4 Antworten

Das ist viel einfacher mit einer Bibliothek wie HttpClient . Es gibt sogar ein Post-XML-Codebeispiel :

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);
0
hinzugefügt

Der Inhalt eines HTTP-Post-Upload-Streams und dessen Funktionsweise scheinen nicht das zu sein, was Sie erwarten. 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 identifiziert, und eine zufällige kleine Folge von Zeichen, 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/netz/HttpURLConnection.html # setChunkedStreamingMode (int)

Wenn Sie nicht wissen, was Sie tun, und es nicht lernen möchten, ist es wirklich einfacher, sich mit dem Hinzufügen einer Abhängigkeit wie Apache HTTPClient zu beschäftigen, da es die gesamte Komplexität abstrahiert und einfach funktioniert.

0
hinzugefügt

Vergiss nicht zu verwenden:

connection.setDoOutput( true)

wenn Sie beabsichtigen, die Ausgabe zu senden.

0
hinzugefügt

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); aufzurufen, nachdem Sie die Verbindung geöffnet haben.

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();
0
hinzugefügt