node.js - 处理 .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。我想有更好的方法来做到这一点!
解决方案
我可以通过另一种方法修复代码。
我为 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 对象上转换它,现在我将正常处理数据。
推荐阅读
- c# - 列出在 Active Directory 中为特定日期范围创建的用户
- python-3.x - 已安装 jupyter-lab 但 jupyter 没有看到它
- reactjs - 反应路由器不显示jsx
- python-3.x - “无效数据。需要字典,但得到了 str ”和“区域 - 此字段是必需的。” 在 django
- shell - 使用 AWK 无法正确执行 Shell 脚本
- nginx - 连接后 Nginx 代理返回 http 400
- reactjs - 如何在 react 中向 chart.js 添加数据
- docker - Airflow DockerOperator 卷和挂载
- amazon-s3 - 您可以在 AWS Athena 上运行 SOUNDEX 查询吗?
- python - 列表理解字符串交替模式递增