繁体   English   中英

如何使用 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 object 的原始字节表示。 似乎很容易得到这个响应,但不是请求。 我对multipart/form-data特别感兴趣。

我查看了文档和 GitHub 问题,但无法弄清楚。

最简单的方法是在任何端口上启动一个 netcat 服务器:

$ nc -l -p 8080

并将代码中的 URL 更改为 localhost:

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

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

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

我想出了如何使用 Request 转储 HTTP 消息体。 在这两种情况下,我只是复制request 内部使用的相同方法。

分段表单上传

req._form.pipe(process.stdout);

URL 编码的表单

console.log(req.body);

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

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

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

  1. 在请求模块中打开调试。 这里记录了多种方法来做到这一点,包括设置NODE_DEBUG=requestrequire('request').debug = true或使用request-debug 模块

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

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

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

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

您可以使用能够记录原始请求/响应字符串的 nodejs 服务器,然后将您的请求定向到该服务器

我举了一个使用 http 和 https 服务器的例子 - 没有依赖关系

nodejs获取原始https请求和响应

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM