Chrome fulfillRequest返回二进制数据

xriantvc  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(178)

我尝试使用CDP拦截请求并返回字节,以便用户直接下载,但Fetch.fulfillRequest的主体似乎只支持base64编码,不支持二进制数据返回。
期望可以拦截请求,使得请求可以直接下载指定内容。

jmo0nnb3

jmo0nnb31#

在Chrome DevTools协议(CDP)中,当使用Fetch.fulfillRequest方法时,body参数实际上只支持base64编码的数据。此限制是由于CDP中的响应主体预期为base64编码的字符串。
但是,您仍然可以通过将二进制数据转换为base64编码的字符串来完成二进制数据的请求。您可以使用JavaScript中的btoa函数来实现此转换。下面是一个示例:

const { fetch } = require('puppeteer');

async function interceptRequestAndFulfillWithBinaryData(page, url, binaryData) {
  // Intercept network requests
  await page.setRequestInterception(true);

  page.on('request', interceptedRequest => {
    if (interceptedRequest.url() === url) {
      // Fulfill the request with binary data converted to base64
      const base64Data = Buffer.from(binaryData).toString('base64');
      interceptedRequest.respond({
        status: 200,
        contentType: 'application/octet-stream', // Set the appropriate content type
        body: base64Data,
      });
    } else {
      interceptedRequest.continue();
    }
  });

  // Navigate to a page that triggers the request
  await page.goto('https://example.com');

  // Disable request interception after fulfilling the request
  await page.setRequestInterception(false);
}

// Example usage
(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  // Replace 'url' and 'binaryData' with your actual values
  const url = 'https://example.com/your-file';
  const binaryData = /* Your binary data here */;

  await interceptRequestAndFulfillWithBinaryData(page, url, binaryData);

  // Close the browser after the download is initiated
  await browser.close();
})();

字符串
在本例中,interceptRequestAndFulfillWithBinaryData函数拦截指定的URL,将二进制数据转换为base64编码的字符串,并使用base64编码的数据完成请求。请注意,您应该根据所提供的数据类型设置适当的contentType。
请记住,将二进制数据转换为base64会增加数据大小,因此这不是最有效的方法,特别是对于大文件。如果可能,请考虑使用其他方法直接提供二进制数据,例如在服务器响应中设置适当的头以触发文件下载。
如需更深入的学习,并随时了解您的技术堆栈,请考虑JavaScript WeeklyWeb Development Weekly

相关问题