如何使用 Node.js 中的请求库获取原始 HTTP 消息体?

How can I get the raw HTTP message body using the request library in Node.js?

npm-request 库允许我使用漂亮的 JSON 风格的语法构造 HTTP 请求,如下所示。

request.post(
    {
        url: 'https://my.own.service/api/route',
        formData: {
            firstName: 'John',
            lastName: 'Smith'
        }
    },
    (err, response, body) => {
        console.log(body)
    }
);

但为了进行故障排除,我确实需要查看 请求 的 HTTP 消息正文,因为它会出现在网络上。理想情况下,我正在寻找带有 Node.js Buffer 对象的原始字节表示。似乎很容易得到这个响应,但不是请求。我对 multipart/form-data.

特别感兴趣

我查看了文档和 GitHub 个问题,但无法弄明白。

您可以尝试@jfriend00 建议使用像 wireshark 这样的网络嗅探器,但是当您获取 https URL 时,这可能不是最简单的方法,因为它需要一些设置来拦截 TLS连接。

所以也许为请求模块本身打开调试模式就足够了,您可以通过简单地设置 require('request').debug = true 来做到这一点。作为第三个选项,您可以使用请求 here 的专用调试模块,它允许您查看请求和响应 headers 以及正文。

我可以想出很多方法来查看请求的字节数:

  1. 在请求模块中打开调试。有多种方法可以做到 here including setting NODE_DEBUG=request or require('request').debug = true or using the request-debug module.

  2. 使用网络嗅探器查看通过套接字实际发送的内容,与您的 node.js 代码无关。

  3. 创建您自己的虚拟 http 服务器,它只记录确切的传入请求并将您的相同请求发送到该虚拟服务器,以便它可以为您记录。

  4. 创建或使用代理(如 nginx),它可以在将传入请求转发到最终目的地之前转储确切的传入请求,并将请求发送到代理。

  5. 在调试器中逐步发送请求,以准确查看它向套接字写入的内容(这可能很耗时,尤其是使用异步回调时,但最终会起作用)。

我想出了如何使用 Request 转储 HTTP 消息体。在这两种情况下,我只是复制 request 使用 internally.

的相同方法

多部分表单上传

req._form.pipe(process.stdout);

URL-编码形式

console.log(req.body);

最简单的方法是在任意端口启动 netcat 服务器:

$ nc -l -p 8080

并在您的代码中将 URL 更改为本地主机:

https://localhost:8080/v1beta1/text:synthesize?key=API_KEY

现在,发出的任何请求都将打印发送到本地主机服务器的整个原始 HTTP 消息。

显然,您将无法看到响应,但是整个原始请求数据将可供您在具有 netcat 的终端中进行检查 运行