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
相关产品推荐
相关产品推荐

