Обработка ответа API в .gzip с файлом XML внутри - PullRequest
0 голосов
/ 11 января 2020

Я пытаюсь обработать это взаимодействие API с node.js (используя express и запрос), но у меня много проблем с данными.

Вот мой текущий код:

// Requirements
const express = require("express");
const bodyParser = require("body-parser");
const request = require("request");
const fs = require("fs");
const zlib = require("zlib");
const gunzip = require("gunzip-file");
const decompressResponse = require("decompress-response");
// Setting Up App
const app = express();
app.use(bodyParser.urlencoded({ extended: false }));

// Routes

app.get("/", (req, res) => {
  res.send("App Running");
});

// API Integration
let responseXML = "";
let bodyXML =
  '<?xml version="1.0" encoding="UTF-8"?><RequestMensagemCB><login>14087809000107</login><senha>xxxx</senha><mId>1</mId></RequestMensagemCB>';

const options = {
  url: "http://webservice.newrastreamentoonline.com.br/",
  method: "POST",
  body: bodyXML
};

app.get("/onix", function(req, res) {
  request(options, function(error, response, body) {
    // body is the decompressed response body
    console.log(
      "server encoded the data as: " +
        (response.headers["content-encoding"] || "identity")
    );
    console.log("the decoded data is: " + body);
  })
    .on("data", function(data) {
      // decompressed data as it is received
      console.log("decoded chunk: " + data);
    })
    .on("response", function(response) {
      // unmodified http.IncomingMessage object
      response.on("data", function(data) {
        // compressed data as it is received
        console.log("received " + data.length + " bytes of compressed data");
      });
    });
});

// Server Listening

app.listen(process.env.PORT || 3000, () => {
  console.log("Server Online Listening to port 3000");
});

Это ответ console.log, который я получаю:

enter image description here

Используя почтальона, я могу достичь XML по следующему маршруту:

Сначала я делаю запрос на публикацию с XML, необходимым для проверки доступа API, затем я отправляю и скачиваю ответ, предоставляя ему расширение .gz и внутри. .gz есть сжатая версия файла, которая при открытии показывает ответ XML:

enter image description here

Я впервые работаю с API который возвращает данные в .gz таким образом. Я попытался передать данные с помощью zLib и теперь думал о следующем маршруте: загрузите ответ в .gz, распакуйте полученный файл, затем откройте его, чтобы получить XML. Я полагаю, есть лучший способ сделать это!

1 Ответ

0 голосов
/ 11 января 2020

Я мог бы исправить код другим способом.

Я добавил еще 2 параметра для параметров const:

const options = {
  url: "http://webservice.newrastreamentoonline.com.br/",
  method: "POST",
  body: bodyXML,
  headers: {
    "Accept-Encoding": "gzip"
  },
  encoding: null,
  gzip: true
};

Значение ключа следующее: encoding: null,, таким образом, поток идет без повреждений.

Тогда я смог распечатать XML ответ. Используя xml2 json NPM я смог преобразовать его в JSON объект, и теперь я буду нормально работать с данными.

...