Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

[ExpressJs] Como pegar a requisição "pura" ?

Boa noite, pessoal

Como dito anteriormente, estou usando o projeto como base pra um que estou trabalhando e hoje obtive uma coisa que me fez quebrar a cabeça inúmeras vezes e mesmo assim não estou conseguindo resolver.

A plataforma na qual estou integrando tem um sistema de Hooks, que me envia o status das transações assim que elas mudarem. Então por exemplo, se fizeram uma transação na minha plataforma e essa transação foi cancelada depois, esse sistema deles vai me enviar uma requisição xml com cabeçalho "content-type: x-www-form-urlencoded" dizendo que esta transação mudou de status.

E é aí que mora o problema. Eles enviam uma requisição com cabeçalho de url-encoded mas no corpo da requisição enviam um xml.

Eu queria saber como faço pra pegar o corpo desta requisição, isto é, o xml em string. Porquê o bodyParser não funciona nesse tipo de caso. Eu até tenho um middleware

    app.use(bodyParser.urlencoded({extended: true}));

mas, obviamente o req.body chega vazio na hora de tratar essa requisição. Eu tentei usar o bodyParser.raw e coloquei no options o type como : "*", mas mesmo assim não consegui uma solução.

Obrigado!

8 respostas

Olá, Caio.

Não se se entendi muito bem sua dúvida. Mas se você está querendo responder um XML para uma reqquest o bodyParser não faz isso. Você precisa usar outro pacote chamado xml:

const xml = require('xml')

response.set('Content-Type', 'text/xml')
response.send(xml(name_of_restaurants))

Olá. Marco

Não, não é isso, é bem mais complexo. Um cliente quer me enviar uma requisição http onde o cabeçalho Content-type está como: x-www-form-urlencoded e o body desta requisição é um xml.

Eu não sei porquê eles fazem isso, mas eu não posso pedir para que eles mudem o jeito de fazer. É claro que o certo seria enviar o body como urlencoded, mas eles enviam xml. Portanto, o bodyParser para urlencoded não vai funcionar, já que ele espera fazer parse de urlencoded. Por isso que estou perguntando como fazer para pegar a data da request independentemente de qual seja o content-type desta requisição.

No link abaixo tem uma sugestão de solução para um problema parecido com esse:

https://stackoverflow.com/questions/41552432/express-api-json-and-xml-post-request

Olha, acho que já testei isso e não deu certo. Vou tentar novamente e trago os resultados, valeu!

Olá, Caio.

Conseguiu testar? :-)

Boa noite, pessoal

Sim, eu testei e mesmo assim não da certo. O req.body continua vazio.

Att

solução!

Boa noite, pessoal

Consegui resolver o problema.

Pesquisei na documentação do Express sobre como escrever Middlewares e também achei um ótimo tópico que me deu toda a base pra fazer isso.

    app.use(function (req, res, next) {
        req.rawBody = '';
        req.setEncoding('utf8');

        req.on('data', function (chunk) {
            req.rawBody += chunk;
        });

        req.on('end', function () {
            next();
        });
    });

No fim, o que consegui fazer foi pegar a string que é enviada na requisição e jogar pra uma variável chamada rawBody, assim eu consigo usar ela dentro da rota da requisição e dar um parse com o xml2js.

Também é importante avisar que é necessário jogar para uma outra variável como essa rawBody porquê senão os outros parsers vão passar por cima.

Até mais, obrigado por tudo

Muito bom Caio.

Obrigado por postar a solução :-)