代码之家  ›  专栏  ›  技术社区  ›  Alexander Ko

节点。js编码问题

  •  0
  • Alexander Ko  · 技术社区  · 7 年前

    我正在尝试从firebase云函数中的api(api.keepa.com,仅供测试)获取数据。因此,我有以下代码:

    var url = "https://api.keepa.com"
    
    var request = require('request');
    
    console.log(url)
    
    request(url, function (error1, response1, body1) {
        if (!error1 && response1.statusCode == 200) {
            console.log(body1)
            }
        else{
            console.log("Error:",error1)
        }
    });
    

    当我在浏览器中检查它时,我会得到一个正常的结果(“对我们的数据感兴趣?请查看我们的API: https://keepa.com/#!api “”。

    当我在firebase cloud函数或repl中运行它时。它,我只得到“+I-J-.IMQS/-RHI,IWpHMKbV%%Vz \&H”。

    我做错什么了吗?对我来说似乎是个编码问题。

    更新:我添加了标题数据的屏幕截图。 enter image description here

    2 回复  |  直到 7 年前
        1
  •  2
  •   zero298    7 年前

    告诉请求您希望它使用 gzip :

    const args = {
      uri: "https://api.keepa.com",
      gzip: true
    };
    
    request(args, (err, res, body) => err ? console.error(err) : console.log(body));
    

    根据 docs :

    gzip公司 -如果 true ,添加 Accept-Encoding 请求压缩的标头 来自服务器的内容编码(如果尚未存在)和解码 响应中支持的内容编码。 笔记 :自动解码 的 response 对通过返回的正文数据执行内容 request (通过 要求 流并传递给回调 功能),但未在上执行 回答 流(可从 这个 回答 事件),它是未修改的 http.IncomingMessage 对象,该对象可能包含压缩数据。请参见下面的示例。

        2
  •  0
  •   tadman    7 年前

    看看 Content-Encoding 标题。它是gzip,在节点中,您必须通过 Zlib 函数先解压缩它,然后它将成为可读的JSON数据。

    您可以更轻松地使用流执行此操作 pipe 到解压缩流,然后通过管道将其传输到JSON解码器。

    或者,您可以提出请求,但设置 Accept-Encoding 头拒绝压缩,但这将导致下载速度变慢和使用更多带宽。