在响应被分块时获取整个响应主体?

时间:2011-02-22 21:01:05

标签: http node.js

我正在发出HTTP请求并收听“数据”:

response.on("data", function (data) { ... })

问题在于响应被分块,因此“数据”只是被发回的一部分。

如何将全身送回?

7 个答案:

答案 0 :(得分:69)

request.on('response', function (response) {
  var body = '';
  response.on('data', function (chunk) {
    body += chunk;
  });
  response.on('end', function () {
    console.log('BODY: ' + body);
  });
});
request.end();

答案 1 :(得分:25)

https://groups.google.com/forum/?fromgroups=#!topic/nodejs/75gfvfg6xuc,Tane Piper提供了一个非常类似于scriptfromscratch的解决方案,但对于JSON响应的情况:

  request.on('response',function(response){
     var data = [];
     response.on('data', function(chunk) {
       data.push(chunk);
     });
     response.on('end', function() {
       var result = JSON.parse(data.join(''))
       return result
     });
   });`

这解决了OP在scriptfromscratch的回答的评论部分提出的问题。

答案 2 :(得分:6)

我从未使用过HTTP-Client库,但由于它的工作方式与服务器API类似,请尝试以下方法:

var data = '';
response.on('data', function(chunk) {
  // append chunk to your data
  data += chunk;
});

response.on('end', function() {
  // work with your data var
});

请参阅node.js docs以供参考。

答案 3 :(得分:5)

为了支持所有可能的HTTP应用程序,Node.js的HTTP API非常低级。因此,块数据不是整体收到的。
  您可以采用两种方法解决此问题:

1)在多个“数据”事件中收集数据并附加结果
  在打印输出之前一起。使用“结束”事件来确定   流完成后您可以编写输出。

var http = require('http') ;
http.get('some/url' , function (resp) {
    var respContent = '' ;
    resp.on('data' , function (data) {
        respContent += data.toString() ;//data is a buffer instance
    }) ;
    resp.on('end' ,  function() {
        console.log(respContent) ;
    }) ;
}).on('error' , console.error) ;

2)使用第三方软件包来解决所涉及的困难   收集整个数据流。两个不同的包提供了一个   用于解决此问题的有用API(可能还有更多!):bl(缓冲区
  列表)和concat-stream;随便挑选!

var http = require('http') ;
var bl = require('bl') ;

http.get('some/url', function (response) {
    response.pipe(bl(function (err, data) {
        if (err) {
            return console.error(err)
        }
        data = data.toString() ;
        console.log(data) ;
    })) 
}).on('error' , console.error) ;

答案 4 :(得分:3)

它搞砸的原因是因为你需要调用JSON.parse(data.toString())。数据是缓冲区,因此您不能直接解析它。

答案 5 :(得分:1)

如果您不介意使用请求库

var request = require('request');
request('http://www.google.com', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body) // Print the google web page.
  }
})

答案 6 :(得分:0)

HTTPS分块响应如何?我一直在尝试从API读取响应,该API通过HTTPS进行响应,其标题为Transfer-Encoding:chunked。每个块都是一个缓冲区,但是当我将它们全部合并在一起并尝试使用UTF-8转换为字符串时,我得到了奇怪的字符。