【问题标题】:http GET from node.js来自 node.js 的 http GET
【发布时间】:2017-10-24 10:11:42
【问题描述】:

在人们的大力帮助下,我在 node.js 中摸索,我正在努力将 GET 请求的主体放入变量中。

这是目前为止的代码:

var speechOutput;

var myCallback = function(data) {
  console.log('got data: '+data);
  speechOutput = data;
};


var usingItNow = function(callback) {
  var http = require('http');    
  var url = 'http://services.groupkt.com/country/get/iso2code/IN';

    var req = http.get(url, (res) => {
        var body = "";

        res.on("data", (chunk) => {
            body += chunk;
        });

        res.on("end", () => {
            var result = JSON.parse(body);

            callback(result);
        });
    }).on('error', function(e){
      console.log("Got an error: ", e);
    });
};

usingItNow(myCallback);

我正在使用其他帖子中的示例来尝试将 GET 请求的主体放入 SpeechOutput 变量中,但它以未定义的形式出现。

最终我想要 SpeechOutput 中的 RestResponse.result.name,但我想我会一次迈出这一步。有没有人可以指点一下?

除此之外,我还尝试了以下方法,但仍然未定义 - 也许代码存在更大的问题?它甚至似乎没有进入解析。

res.on("end", () => {
           // var result = JSON.parse(body);        
            callback('result');
        });

callback('result'); 行放在var req = http.get(url, (res) => { 行之前会返回“结果”,但其他任何内容都未定义或导致错误。

【问题讨论】:

  • 我认为您将 GET 请求的(不存在的)正文与响应的正文混淆了。
  • 您已经确定 result 变量的值是 undefined ……但您还没有回过头来找出原因。查看body的值。
  • 当我运行该代码时,我得到的输出是got data: [object Object]。没有错误。没有undefined 的迹象。我无法重现您描述的问题。

标签: node.js rest callback get


【解决方案1】:

引用 Roy T.Fielding:

但是,GET 的服务器语义受到限制,因此主体, 如果有的话,对请求没有语义意义。要求 解析上的要求与方法语义上的要求是分开的。

不要使用 get 请求发送 body 参数。使用发布请求。如果要在 get 请求中发送数据,请将它们添加到查询字符串中。

阅读本文以获取有关获取请求中的主体的更多信息: HTTP GET with request body

更新:

尝试在响应中记录错误,在设置监听器之前添加:

  var body = "";
  const { statusCode } = res;
  const contentType = res.headers['content-type'];

  let error;
  if (statusCode !== 200) {
    error = new Error('Request Failed.\n' +
                      `Status Code: ${statusCode}`);
  } else if (!/^application\/json/.test(contentType)) {
    error = new Error('Invalid content-type.\n' +
                      `Expected application/json but received ${contentType}`);
  }
  if (error) {
    console.error(error.message);
    // consume response data to free up memory
    res.resume();
    return;
  }
 res.on("data", (chunk) => {
        body += chunk;
    });

【讨论】:

  • 我不想传递正文,我只想调用 URL 并接收正文。
猜你喜欢
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
相关资源
最近更新 更多