Escribir datos de entrada de un servlet java a otro

Estoy intentando 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 xml no esencial reemplazado por "Hola")

   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 del servidor, y el segundo servlet nunca se invoca.

0
agregado
Puntos de vista: 1

4 Respuestas

Este tipo de cosas es mucho más fácil usando una biblioteca como HttpClient . Incluso hay un ejemplo de código xml publicado :

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
agregado

El contenido de una secuencia de carga de la publicación HTTP y la mecánica de la misma no parecen ser lo que usted espera que sean. 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 aumenta en un pequeño número que identifica el fragmento y una pequeña secuencia aleatoria de caracteres que delimita cada fragmento a medida que se escribe sobre el flujo. 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 no sabes lo que estás haciendo y no quieres aprenderlo, lidiar con agregar una dependencia como Apache HTTPClient realmente termina siendo mucho más fácil porque abstrae toda la complejidad y simplemente funciona.

0
agregado

No te olvides de usar:

connection.setDoOutput( true)

si tiene la intención de enviar resultados.

0
agregado

Recomiendo utilizar Apache HTTPClient en su lugar, porque es una API más agradable.

Pero para resolver este problema actual: intente llamar a 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();
0
agregado