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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top