在 NodeJS 中获取原始 HTTP 响应

Posted

技术标签:

【中文标题】在 NodeJS 中获取原始 HTTP 响应【英文标题】:Get raw HTTP response in NodeJS 【发布时间】:2022-01-18 20:57:54 【问题描述】:

我可以通过这种方式获取原始 HTTP 请求:

// ...
server.listen(8080);
 
server.on('connection', function(socket) 
  socket.on('data', function(data) 
    console.log(data.toString());
  );
);

但是如何在 NodeJS 中获得原始答案(HTTP 响应)? 我需要类似的东西(在我的 NodeJS,而不是浏览器中):

HTTP 200 OK
Content-Length: 1000
...

【问题讨论】:

您真正想解决什么问题?您可以打开一个普通的 TCP 套接字到 http 服务器,通过它发送一个 http 请求,然后读取响应,您将获得原始的、未解析的在线 http 响应。这本质上是 http 客户端或库已经在做的事情 - 然后它会解析该响应以使其有用。 我只想看到一个真正的 HTTP 响应,当我在 NodeJS 中调用类似: res.writeHead(200, 'Content-Type': 'text/html'); res.write(someData); res.end(); 你的意思是你想看看你现有的http服务器正在向客户端发送什么?而且,你想从服务器上看到吗?你真正想解决什么问题? 我对这件事只有理论上的兴趣。目前我没有解决任何问题。例如,我想查看一系列带有 Set-Cookie 标头和其他内容的行。 【参考方案1】:

我很好奇你真正想解决什么问题,因为可能有更好的方法。

但是,如果您只是想侵入给定的响应以查看通过该套接字发送的确切内容,您可以修改 socket.write() 方法来执行以下操作:

const app = require('express')();

app.get("/", (req, res) => 
    // monkey patch socket.write
    // so we can log every sent over the socket
    const socket = req.socket;
    socket.origWrite = socket.write;
    socket.write = function(data, encoding, callback) 
        if (Buffer.isBuffer(data)) 
            console.log(data.toString());
         else 
            console.log(data);
        
        return socket.origWrite(data, encoding, callback);
    
    res.cookie("color", "blue");
    res.send("Hi.  This is my http response.")
);

app.listen(80);

当我运行它并向该路由发出浏览器请求时,我在控制台中看到了这个:

HTTP/1.1 200 OK
X-Powered-By: Express
Set-Cookie: color=blue; Path=/
Content-Type: text/html; charset=utf-8
Content-Length: 30
ETag: W/"1e-eJoRAEkyvi+cvBVvRkYOHolFbNc"
Date: Wed, 15 Dec 2021 19:43:20 GMT
Connection: keep-alive
Keep-Alive: timeout=5


Hi.  This is my http response.

这与 Chrome 调试器在接收端显示的 http 响应完全匹配。

我花了相当多的时间寻找一些内置在 nodejs 中的调试标志,这些标志会自动输出,但找不到。 'net' 模块确实有一些调试,但它与套接字事件和生命周期有关,而不是与发送/接收的实际数据有关。


仅供参考,您还可以使用诸如 WireShark 之类的网络分析器(还有许多其他网络分析器)“检查”原始网络数据,这些分析器会修补到您的网络适配器中,并且可以配置为观察事物并向您准确显示数据是什么发送/接收。

【讨论】:

添加了 Buffer 的输出并在响应中添加了一个示例 cookie。

以上是关于在 NodeJS 中获取原始 HTTP 响应的主要内容,如果未能解决你的问题,请参考以下文章

Node JS请求获取原始url

如何在 express/node js 中发送错误 http 响应?

nodejs将原始图像数据写入jpeg文件?

Nodejs telnet 实时响应获取

如何使用 nodeJS 从 axios 库中获取有效的 JSON 响应

nodeJS:获取响应未在浏览器中打开-说页面不起作用