Escrevendo dados de postagem de um servlet java para outro

Eu estou tentando escrever um servlet que irá enviar um arquivo xml (string formatada xml) para outro servlet através de um POST. (Código de geração de xml não essencial substituído por "Hello there")

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

Isso está causando um erro no servidor e o segundo servlet nunca é chamado.

0
adicionado
Visualizações: 1

4 Respostas

Esse tipo de coisa é muito mais fácil usando uma biblioteca como o HttpClient . Existe até um exemplo de código de postagem 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);
0
adicionado

O conteúdo de um fluxo de upload de postagem HTTP e a mecânica dele não parecem ser o que você espera que eles sejam. Você não pode simplesmente escrever um arquivo como o conteúdo da postagem, porque o POST tem padrões RFC muito específicos sobre como os dados incluídos em uma solicitação POST devem ser enviados. Não é apenas o formato do conteúdo em si, mas é também a mecânica de como ele é "escrito" no fluxo de saída. Muitas vezes, o POST é agora escrito em partes. Se você olhar o código-fonte do HTTPClient do Apache, verá como ele grava os fragmentos.

Há peculiaridades com o comprimento do conteúdo como resultado, porque o comprimento do conteúdo é aumentado por um pequeno número identificando o fragmento e uma pequena seqüência aleatória de caracteres que delimita cada fragmento à medida que ele é gravado no fluxo. Veja alguns dos outros métodos descritos nas versões mais recentes do Java do HTTPURLConnection.

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

Se você não sabe o que está fazendo e não quer aprendê-lo, lidar com a adição de uma dependência como o Apache HTTPClient realmente acaba sendo muito mais fácil porque abstrai toda a complexidade e apenas funciona.

0
adicionado

Não esqueça de usar:

connection.setDoOutput( true)

se você pretende enviar saída.

0
adicionado

Eu recomendo usar o Apache HTTPClient em vez disso, porque é uma API mais agradável.

Mas para resolver este problema atual: tente chamar connection.setDoOutput (true); depois de abrir a conexão.

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
adicionado