2008-09-18 14 views
9

Estoy tratando de escribir un servlet que envíe un archivo XML (cadena con formato xml) a otro servlet a través de un POST. (código de generación de xml no esenciales reemplazado con "Hola")Escribiendo datos de entrada de un servlet java a otro

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

Esto está causando un error de servidor, y el segundo servlet no se invoca.

Respuesta

13

Este tipo de cosas es mucho más fácil el uso de una biblioteca como HttpClient. Incluso hay un 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

No se olvide de usar:

connection.setDoOutput(true) 

si tiene la intención de enviar la salida.

8

En su lugar, recomiendo usar Apache HTTPClient, ya que es una API más agradable.

Pero para resolver este problema actual: intente llamar al connection.setDoOutput(true); después de abrir la conexión.

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

El contenido de una corriente de carga HTTP POST y la mecánica del mismo no parece ser lo que se esperaba que fueran. No se puede simplemente escribir un archivo como el contenido de la publicación, porque POST tiene estándares RFC muy específicos sobre cómo se supone que se envían los datos incluidos en una solicitud POST. No es solo el formato del contenido en sí, sino que también es la mecánica de cómo está "escrito" en la salida de salida. Una gran parte del tiempo POST ahora está escrito en fragmentos. Si miras el código fuente del HTTPClient de Apache, verás cómo escribe los fragmentos.

Hay caprichos con la longitud del contenido como resultado, porque la longitud del contenido se incrementa en un pequeño número que identifica el trozo y una pequeña secuencia aleatoria de caracteres que delimita cada fragmento a medida que se escribe sobre la secuencia. Observe algunos de los otros métodos descritos en las versiones Java más recientes de HTTPURLConnection.

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

Si usted no sabe lo que está haciendo y no quieren aprenderlo, que trata de la adición de una dependencia como Apache HTTPClient realmente no llegar a ser mucho más fácil, ya que abstrae toda la complejidad y solo funciona

Cuestiones relacionadas