You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Puppeteer拦截XHR请求获取postData异常,求原始POST数据获取方法

解决Puppeteer获取二进制POST数据异常的问题

我之前也碰到过一模一样的情况!问题根源在于Puppeteer默认会把二进制POST数据尝试解析成UTF-8字符串,而你发送的[0xac, 0xed, 0x00, 0x05]这类非UTF-8兼容字节,会被错误编码成多字节的替换字符(�),导致原本4字节的数据变成了8字节。而PHP的file_get_contents("php://input")是直接读取原始字节流,所以能拿到正确结果。

要获取原始的POST数据,你可以用以下两种方案:

方法1:使用request.postDataBuffer()(推荐)

Puppeteer提供了postDataBuffer()方法,它会直接返回请求的原始二进制Buffer,完全不会有编码问题。示例代码如下:

// 监听页面请求
page.on('request', (request) => {
  // 筛选出目标XHR POST请求
  if (request.resourceType() === 'xhr' && request.method() === 'POST') {
    // 获取原始二进制Buffer
    const rawPostBuffer = request.postDataBuffer();
    // 转成你需要的Uint8Array格式
    const originalBytes = new Uint8Array(rawPostBuffer);
    console.log('原始发送的字节数组:', originalBytes);
    // 这里输出应该就是 [0xac, 0xed, 0x00, 0x05]
  }
  request.continue();
});

这个方法是官方推荐的,能完美保留原始字节数据,和PHP端拿到的内容完全一致。

方法2:针对旧版本Puppeteer的兼容方案

如果你的Puppeteer版本低于v10(postDataBuffer()是v10新增的),可以尝试直接访问请求的内部Buffer对象(注意:这是非官方API,可能随版本变化):

page.on('request', (request) => {
  if (request.resourceType() === 'xhr' && request.method() === 'POST') {
    const rawBuffer = request._request._postData;
    const originalBytes = new Uint8Array(rawBuffer);
    console.log('原始字节数组:', originalBytes);
  }
  request.continue();
});

不过更建议你升级到最新版Puppeteer,避免依赖非公开API带来的兼容性问题。

额外验证

你可以把Buffer转成十六进制字符串来对比:

console.log(rawPostBuffer.toString('hex')); // 应该输出 "aced0005"

这个结果和PHP端bin2hex(file_get_contents("php://input"))的输出是完全一致的。

内容的提问来源于stack exchange,提问作者user2098408

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:35:35