Pregunta

Estoy intentando escribir un servlet que envíe un archivo XML (cadena con formato xml) a otro servlet mediante una 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 provoca un error en el servidor y el segundo servlet nunca se invoca.

¿Fue útil?

Solución

Este tipo de cosas es mucho más fácil usando una biblioteca como Cliente HTTP.Incluso hay un ejemplo de código 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);

Otros consejos

recomiendo usar apache Cliente HTTP en cambio, porque es una API mejor.

Pero para resolver este problema actual:intenta llamar 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();

El contenido de una secuencia de carga de publicaciones HTTP y su mecánica no parecen ser lo que usted espera que sean.No se puede simplemente escribir un archivo como contenido de la publicación, porque POST tiene estándares RFC muy específicos sobre cómo se supone que deben enviarse los datos incluidos en una solicitud POST.No se trata sólo del formato del contenido en sí, sino también de la mecánica de cómo se "escribe" en el flujo de salida.Muchas veces, POST ahora se escribe en fragmentos.Si observa el código fuente del HTTPClient de Apache, verá cómo escribe los fragmentos.

Como resultado, hay peculiaridades con la longitud del contenido, porque la longitud del contenido aumenta con 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 en la secuencia.Mire 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 sabe lo que está haciendo y no quiere aprenderlo, agregar una dependencia como Apache HTTPClient realmente termina siendo mucho más fácil porque abstrae toda la complejidad y simplemente funciona.

No olvides utilizar:

connection.setDoOutput( true)

si tiene la intención de enviar resultados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top