【问题标题】:node request module: parsing XML as JSON节点请求模块:将 XML 解析为 JSON
【发布时间】:2019-03-07 15:12:42
【问题描述】:

直到最近,我一直在使用node request 模块获取 XML 数据,然后通过 XML 到 JSON 转换器运行该 XML。我偶然发现,如果我将 json: true 设置为一个选项(即使知道端点返回 XML,而不是 JSON),我实际上会返回 JSON:

var request = require('request');
var options = { gzip: true, json: true, headers: { 'User-Agent': 'stackoverflow question (https://stackoverflow.com/q/52609246/4070848)' } };
options.uri = 'https://api.met.no/weatherapi/locationforecast/1.9/?lat=40.597&lon=-74.26';
request(options, function (error, response, body) {
    console.log(`body for ${options.uri}: ${JSON.stringify(body)}`);
});

上述调用返回 JSON,而 raw URL 实际上是发送 XML。果然,json: false返回的数据是XML:

var request = require('request');
var options = { gzip: true, json: true, headers: { 'User-Agent': 'stackoverflow question (https://stackoverflow.com/q/52609246/4070848)' } };
options.uri = 'https://api.met.no/weatherapi/locationforecast/1.9/?lat=40.597&lon=-74.26';
options.json = false; // <<--- the only difference in the request
request(options, function (error, response, body) {
    console.log(`body for ${options.uri}: ${body}`);
});

所以我认为“这很方便”,直到我用 different URL that also returns XML 尝试了同样的技巧,在这种情况下,尽管使用了相同的请求选项,但返回的数据仍然是 XML:

var request = require('request');
var options = { gzip: true, json: true, headers: { 'User-Agent': 'stackoverflow question (https://stackoverflow.com/q/52609246/4070848)' } };
options.uri = 'https://graphical.weather.gov/xml/SOAP_server/ndfdXMLclient.php?whichClient=NDFDgen&lat=40.597&lon=-74.26&product=time-series&temp=tempSubmit=Submit';
request(options, function (error, response, body) {
    console.log(`body for ${options.uri}: ${body}`);
});

这里有什么区别?如何获得后一个请求以 JSON 格式返回数据(这样我就可以避免自己将 XML 转换为 JSON 的步骤)?也许第一个示例中的端点可以检测到请求 JSON 并且它确实返回 JSON 而不是 XML?

EDIT 奇怪的是,第一个请求现在返回 XML 而不是 JSON,即使使用 json: true。所以也许这种行为归结为从端点发送的内容,即使在我几个小时前发布后他们已经改变了这一点

【问题讨论】:

  • 他们在看着你! :)
  • 绝对有可能,因为我特意在用户代理中添加了这篇文章的链接:)
  • 好吧,如果你还在看这篇文章met.nodevs,把它改回来!在 REST API 世界中,提供资源的多种表示形式并区分 Accept 和 Content-Type 标头是非常标准的东西。

标签: json node.js xml node-request


【解决方案1】:

既然行为不可重复,答案对您的特定问题的用处不大,但我认为值得指出的是,当您在 request 模块上设置 json:true 时,它在后台做了一些事情给你:

  • 将 Accept 标头设置为 'application/json'
  • 使用JSON.parse()解析响应正文
  • 带有正文的请求类型也会将正文自动序列化为 JSON
  • 带有正文的请求类型还会将 Content-Type 标头添加为“application/json”

所以也许他们确实改变了它,但是我见过很多 Web 服务会根据 Accept 标头检测要发送的内容类型,并对一些有意义的类型(通常是 XML 或JSON,但有时是 CSV、TXT、HTML 等)。

【讨论】:

  • 谢谢,这真的很有帮助,有趣的是(我怀疑这是一种可能性)端点可以根据请求调整其响应(例如返回 JSON 而不是 XML)。至少我可以排除request模块本身正在接收XML并在内部将其转换为JSON(基于json: true)的可能性......所以现在请求XML(json: false)是最安全的并做转换自己。
【解决方案2】:

为了处理 XML 查询,我通常使用 request 模块做这样的事情:

import parser from "xml2json";
const resp = await rp({
  method: "POST",
  url: 'some url',
  form: {xml_query}, // set XML query to xml_query field
});
const parsedData = parser.toJson(resp, {
  object: true, // returns a Javascript object instead of a JSON string
  coerce: true, // makes type coercion.
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-08
    • 2019-01-14
    • 2013-01-31
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    相关资源
    最近更新 更多