我可以从 http 模块 .get 响应中获取 nodejs 中的完整 http 响应文本吗?

Posted

技术标签:

【中文标题】我可以从 http 模块 .get 响应中获取 nodejs 中的完整 http 响应文本吗?【英文标题】:Can I get the full http response text in nodejs from a http module .get response? 【发布时间】:2022-01-10 04:41:48 【问题描述】:

我有一个非常简单的网络服务器:

const ws = require('http');

ws.createServer(
    function(req,res)
    
        console.log('request received');
        res.write('Hello world');
        res.end();
    )
    .listen(1234);

服务器正常工作。当我在 localhost:1234 上打开浏览器时,我得到 Hello World 文本。当我从 REST 客户端向 localhost:1234 发送 GET 时,我得到:

HTTP/1.1 200 OK
Date: Fri, 03 Dec 2021 20:10:12 GMT
Connection: close
Transfer-Encoding: chunked

Hello world

现在,我想编写一个测试,但我无法找到从响应中提取“Hello world”文本的任何方法。目前,我的测试代码如下所示:

const http = require('http');

let req = http.get('http://localhost:1234',(res)=>
    let txt = res.read();
    console.log(txt);
);

这总是返回 null。

我也试过了:

const http = require('http');

let req = http.get('http://localhost:1234',(res)=>
    let data = [];
    res.on('data',(chunk)=>data.push(chunk));
    console.log(data);
);

这会返回一个空数组。

当我调试并查看 res 对象时,很容易在响应中找到除 Hello World 文本之外的所有内容(主要在 res.headers 中)。我已经看到很多例子来提取以 JSON 格式发送的数据等,但我想从最简单的例子(只是纯文本)开始,似乎找不到任何方法来做到这一点。当我通过 HTTP 模块发送 GET 时,似乎浏览器可以返回的任何东西应该可用,但我找不到它。

【问题讨论】:

【参考方案1】:

您可以通过这种方式将响应读取为 json:

服务器文件:

const ws = require('http');

ws.createServer(
  (request, response) => 

    console.log('request received');

    response.write('"body": "Hello World !"');
    response.end();

  
).listen(1234);

请求文件:

const http = require('http');

http.get('http://localhost:1234', (response) => 

  response.on("data", (chunk) => 

    body = JSON.parse(chunk).body

    console.log(body); // return 'Hello World !' as text
  )

).on('error', function(e) 
  console.log("Error message : " + e.message);
);

【讨论】:

谢谢 - 我在互联网上看到很多这样的例子,但我不能假设任何请求都会返回 JSON。我真的很想看到完整的响应(不仅仅是格式化为 JSON 的部分),最好不要更改服务器上的任何内容(因为当我从 REST 客户端获取时,服务器确实给出了预期的响应)。【参考方案2】:

我设法弄明白了。好吧。我发现了一些有用的东西,但仍然不完全理解它的机制。

以下作品和日志

世界你好

到控制台。

const http = require('http');
let req = http.get('http://localhost:1234',async (res)=>
    res.on('readable', () => 
        let txt=res.read().toString();
        console.log(txt);
    );
);

似乎您需要侦听可读事件才能从 read() 中获取任何内容,并且当您这样做时确实会带回 Hello world 文本(虽然是一个 Buffer 数组,所以需要 ToString() )。

同样,以下内容也适用于“数据”事件:

const http = require('http');

let req = http.get('http://localhost:1234',(res)=>
    let txt = '';
    res.on('data',(chunk)=>
        txt+=chunk.toString();
        console.log(txt);
    );
);

我有一些后续问题,但如果我不明白,我会做更多研究并在新问题中再次提问。

【讨论】:

以上是关于我可以从 http 模块 .get 响应中获取 nodejs 中的完整 http 响应文本吗?的主要内容,如果未能解决你的问题,请参考以下文章

从 jQuery GET JSON 响应字符串中获取单个值

nginx+lua怎样实现http请求的响应

如何使用 fetch 从一个模块导出从 GET API 获得的响应数据到另一个模块

如何从我得到的数组中获取特定的数组元素作为调用 axios.get() 调用的函数的响应 [重复]

http模块get

python 爬虫 基于requests模块的get请求