Scrittura dei dati dei post da un servlet Java a un altro
Domanda
Sto cercando di scrivere un servlet che invierà un file XML (stringa formattata xml) a un altro servlet tramite un POST.(Codice di generazione XML non essenziale sostituito con "Ciao a tutti")
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();
Ciò causa un errore del server e il secondo servlet non viene mai richiamato.
Soluzione
Questo genere di cose è molto più semplice utilizzando una libreria come HttpClient.C'è anche un inviare un esempio di codice 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);
Altri suggerimenti
Consiglio di usare Apache HTTPClient invece, perché è un'API migliore.
Ma per risolvere questo problema attuale:prova a chiamare connection.setDoOutput(true);
dopo aver aperto la connessione.
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();
Il contenuto di un flusso di caricamento di post HTTP e i suoi meccanismi non sembrano essere quelli che ti aspetti.Non puoi semplicemente scrivere un file come contenuto del post, perché POST ha standard RFC molto specifici su come dovrebbero essere inviati i dati inclusi in una richiesta POST.Non è solo la formattazione del contenuto stesso, ma è anche la meccanica di come viene "scritto" nel flusso di output.La maggior parte delle volte POST è ora scritto in blocchi.Se guardi il codice sorgente dell'HTTPClient di Apache vedrai come scrive i blocchi.
Di conseguenza ci sono delle stranezze con la lunghezza del contenuto, perché la lunghezza del contenuto viene aumentata di un piccolo numero che identifica il pezzo e di una piccola sequenza casuale di caratteri che delimita ogni pezzo mentre viene scritto sullo stream.Guarda alcuni degli altri metodi descritti nelle versioni Java più recenti di HTTPURLConnection.
http://java.sun.com/javase/6/docs/api/java/net/HttpURLConnection.html#setChunkedStreamingMode(int)
Se non sai cosa stai facendo e non vuoi impararlo, gestire l'aggiunta di una dipendenza come Apache HTTPClient finisce per essere davvero molto più semplice perché astrae tutta la complessità e funziona e basta.
Non dimenticare di usare:
connection.setDoOutput( true)
se intendi inviare l'output.