Firefox扩展能否修改出站HTTP请求体?实践遇阻求助
Firefox扩展修改出站HTTP请求体无效的解决办法
Firefox的webRequest API确实不支持通过onBeforeRequest直接修改请求体——官方文档明确说明该事件仅用于取消或重定向请求,返回的requestBody字段不会被浏览器处理,这就是你代码无效的原因。
要实现修改请求体的需求,正确的做法是取消原请求,重新构造并发送修改后的请求,再将响应转发给原页面,具体代码如下:
核心代码示例
const text = "http mod test"; async function replaceBody(details) { // 只处理POST请求 if (details.method !== 'POST') return; // 解析原始请求体 const originalBody = details.requestBody.raw[0].bytes; const decoder = new TextDecoder(); const jsonBody = JSON.parse(decoder.decode(originalBody)); jsonBody.content = text; const newBody = JSON.stringify(jsonBody); // 复制并处理原请求头(移除Content-Length,浏览器会自动计算新长度) const headers = new Headers(); details.requestHeaders.forEach(header => headers.append(header.name, header.value)); headers.delete('Content-Length'); // 构造新请求的配置 const requestInit = { method: details.method, headers: headers, body: newBody, credentials: 'include', // 保留会话信息 mode: 'cors' // 适配跨域场景 }; try { // 发送修改后的请求 const response = await fetch(details.url, requestInit); const responseBody = await response.text(); // 将响应通过data URL返回给原请求发起者 return { cancel: true, redirectUrl: `data:application/json,${encodeURIComponent(responseBody)}` }; } catch (err) { console.error('重发请求失败:', err); return { cancel: false }; } } // 注册监听器,需添加requestHeaders权限获取原请求头 browser.webRequest.onBeforeRequest.addListener( replaceBody, { urls: ["*://discord.com/api/v9/channels/*"], types: ["xmlhttprequest"] }, ["blocking", "requestBody", "requestHeaders"] );
必要的Manifest配置
确保你的manifest.json中声明了正确的权限:
{ "manifest_version": 3, "name": "请求体修改工具", "version": "1.0", "permissions": ["webRequest", "webRequestBlocking", "*://discord.com/*"], "background": { "scripts": ["background.js"] } }
关键说明
- 取消原请求:通过返回
{cancel: true}阻止原始请求发送 - 重发请求:使用
fetch构造修改后的请求,带上原请求的会话信息和请求头 - 响应转发:用
data URL将新请求的响应返回给原页面,保证页面逻辑能正常接收响应
内容的提问来源于stack exchange,提问作者user31184281
相关产品推荐
相关产品推荐

