Scrierea datelor postale de la un servlet de java la altul

Încerc să scriu un servlet care va trimite un fișier xml (șir formatat xml) unui alt servlet prin intermediul unui POST. (Cod generator xml generic nesemnificativ înlocuit cu "Bună ziua")

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

Aceasta provoacă o eroare de server, iar al doilea servlet nu este invocat niciodată.

0

4 răspunsuri

Acest tip de lucru este mult mai ușor folosind o bibliotecă ca HttpClient . Există chiar și un exemplu de cod post 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);
0
adăugat

Conținutul unui flux de încărcare a mesajelor HTTP și mecanica acestuia nu par a fi ceea ce vă așteptați să fie. Nu puteți scrie doar un fișier ca conținut post, deoarece POST are standarde RFC foarte specifice cu privire la modul în care ar trebui trimise datele cuprinse într-o cerere POST. Nu este doar formatul conținutului propriu-zis, ci și mecanicul cum este "scris" în fluxul de ieșire. În plus, POST este acum scris în bucăți. Dacă te uiți la codul sursă al HTTPClientului Apache, vei vedea cum scrie acele bucăți.

Există quirks cu lungimea conținutului ca rezultat, deoarece lungimea conținutului este mărită de un număr mic care identifică bucata și o secvență aleatorie de caractere care delimitează fiecare bucată așa cum este scrisă peste flux. Uită-te la unele dintre celelalte metode descrise în versiunile mai noi de Java ale HTTPURLConnection.

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

Dacă nu știți ce faceți și nu doriți să-l învățați, tratarea cu adăugarea unei dependențe ca Apache HTTPClient într-adevăr nu mai este mult mai ușoară deoarece abstractează toată complexitatea și doar funcționează.

0
adăugat

Nu uitați să utilizați:

connection.setDoOutput( true)

dacă intenționați să trimiteți rezultate.

0
adăugat

Vă recomandăm să utilizați Apache HTTPClient , pentru că este un API mai plăcut.

Dar pentru a rezolva această problemă curentă: încercați să apelați connection.setDoOutput (true); după ce deschideți conexiunea.

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
adăugat