quinta-feira, 3 de maio de 2007

Problemas com Post do XMLHttpRequest

Recentemente tive problemas ao tentar utilizar chamadas assíncronas no javascript utilizando o método post do protocolo http. Na verdade, o que ocorria é que os parâmetros enviados por post não eram recebidos em meu servlet. Descobri então como contornar isso, mas não entendi o porque desse problema ter ocorrido.

No javascript eu fazia a seguinte chamada, onde a variavel r era um objeto XMLHttpRequest:
r.open("POST", "http://localhost/MeuServlet", true);
r.send("nome=tiago");

No servlet MeuServlet eu apenas pegava o parâmetro nome e o imprimia na saída padrão:
String nome = request.getParameter("nome");
System.out.println("nome enviado = " + nome);

A saída era sempre "nome enviado = null". Olhando no debugger de chamadas assíncronas do firebug dava pra ver que os parâmetros estavam sendo enviados com sucesso. O problemas estava mesmo na recepção. Eis então que achei um exemplo na internet com o que faltava para meu código javascript:
r.open("POST", "http://localhost/MeuServlet", true);
r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
r.send("nome=tiago");

Colocando essa linha indicando o Content-Type no header da requisição a chamada por post passou a funcionar. Se alguém tiver uma explicação do porque disso será de grande ajuda.

Um comentário:

  1. Olá Thiago, você precisa informar ao servlet que tipo de dados ele está recebendo para que o mesmo possa tratá-los, é uma especificação do HTTP, desta forma ele irá tratar sua URL como um envio de formulário.
    Assim como você deve indicar na resposta o tipo de conteúdo para que o navegador possa traduzi-lo, lembre-se que o XMLHttpRequest trata qualquer tipo de informação baseada em texto ASCII. Caso você esteja recebendo XML o tratamento será diferente de Text.
    Uma dica quando for solicitar algum recurso de um servlet utilize encodeURI(URL_RECURSO) para que o seu container ou servlet controlador possa entender qual o recurso solicitado.
    Espero que tenha ajudado!

    Diego Charles
    Graduando em Ciências da Computação

    ResponderExcluir