首页 > 解决方案 > 处理 .gzip 中的 API 响应,其中包含 XML 文件

问题描述

我正在尝试处理与 node.js 的 API 交互(使用 express 和 request),但我在处理数据时遇到了很多麻烦。

这是我当前的代码:

// 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 响应:

在此处输入图像描述

使用邮递员,我可以通过以下途径访问 XML:

我首先使用验证 API 访问所需的 XML 发出发布请求,然后我发送并下载响应,并为其提供 .gz 的扩展名,在 .gz 内部有一个压缩版本的文件,打开时会显示 XML 响应:

在此处输入图像描述

这是我第一次使用以 .gz 格式返回数据的 API。我已经尝试使用 zLib 管道数据,现在正在考虑以下路线:下载 .gz 中的响应,解压缩生成的文件,然后打开它以访问 XML。我想有更好的方法来做到这一点!

标签: node.jsexpresshttprequestgzip

解决方案


我可以通过另一种方法修复代码。

我为 const 选项添加了另外 2 个参数:

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

关键值如下:encoding: null,,这样流就不会损坏。

然后我就可以打印出 XML 响应了。使用 xml2json NPM 我已经能够在 JSON 对象上转换它,现在我将正常处理数据。


推荐阅读