【问题标题】:How can I get the raw HTTP message body using the request library in Node.js?如何使用 Node.js 中的请求库获取原始 HTTP 消息正文?
【发布时间】:2019-12-11 13:19:33
【问题描述】:

npm-request 库允许我使用良好的 JSON 样式语法构造 HTTP 请求,如下所示。

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

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

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

【问题讨论】:

  • 使用网络嗅探器查看实际通过套接字发送的内容,与您的 node.js 代码无关。
  • 我不是特别想设置网络嗅探器和处理拦截 TLS 连接的麻烦。我想在代码中做到这一点。
  • 如果它是您自己的目标服务器,您可以暂时允许 http 仅用于调试或仅来自您的端点或仅在您的本地测试网络中,以避免 TLS 用于嗅探器。有时你需要创造有利于调试的条件。
  • @jfriend00 这不是我自己的服务器。
  • 我不知道这是否是一个可以接受的答案,所以我现在将其作为评论留下,但您可以修改文件 node_modules/request.js 并在此行之后添加 console.log(arguments)github.com/request/request/blob/master/request.js#L1493

标签: javascript node.js http npm-request


【解决方案1】:

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

$ nc -l -p 8080

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

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

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

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

【讨论】:

  • 在 macOS 中,您应该使用 nc -l 8080 并且效果很好!
【解决方案2】:

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

多部分表单上传

req._form.pipe(process.stdout);

URL 编码的表单

console.log(req.body);

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • request 的调试模式仍然不打印 HTTP 消息正文,它只是以我提供的相同格式将 JSON 对象回显给我。
    • request-debug 模块在其默认配置中仅显示标头,而不显示消息正文。
    【解决方案4】:

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

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

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

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

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

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

      李>

    【讨论】:

    猜你喜欢
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 2016-04-24
    • 2019-10-25
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多