这似乎是困难的问题(或不可能?).我想通过观看Chrome扩展程序后台脚本来获取并阅读由浏览器中的HTTP请求引起的HTTP响应.我们可以通过这种方式获得HTTP Request Body
chrome.webRequest.onBeforeRequest.addListener(function(data){
// data contains request_body
},{'urls':[]},['requestBody']);
Run Code Online (Sandbox Code Playgroud)
我还检查了这些stackoverflows
有没有聪明的方法来获取Chrome扩展中的HTTP响应体?
fetch()返回promise(如果成功)解析为Response对象的promise .一个非常常见的事情是立即调用Response.json()将响应体转换为JSON对象.
如果响应主体无效JSON,则Response.json()承诺失败并显示错误.消息是这样的:
位于0的JSON中出现意外的标记X.
在尝试诊断问题时,这不是很有用; 理想情况下,我希望能够从服务器中看到内容(这通常是一条错误消息).
但是,您似乎只能Response.body一次阅读流(至少在Chrome中).(甚至还有一个只读Response.bodyUsed标志.)当Response.json()尝试将主体转换为JSON 时已经发生这种情况,因此在JSON解析失败的情况下,主体似乎永远丢失.
有没有办法恢复原始的响应体...当原始的fetchPromise结算时,没有手动读取它(然后转换为JSON)?
我想拦截我的应用程序中所有部分和库的提取,同时我不想破坏通过文件URL处理应用程序的可能性 - 它对电子和移动设备(通过WebView)很有用.现在,我发现了两种可行的方法:
像这里的东西
const realFetch = window.fetch;
window.fetch = function() {
// do something
return realFetch.apply(this, arguments)
}
Run Code Online (Sandbox Code Playgroud)像这里的东西,服务工作者注册:
main.js:
if ('serviceWorker' in navigator) {
window.addEventListener('load', function() {
navigator.serviceWorker.register('sw.js').then(function(registration) {
console.log('Service worker registered with scope: ', registration.scope);
}, function(err) {
console.log('ServiceWorker registration failed: ', err);
});
});
}
Run Code Online (Sandbox Code Playgroud)
sw.js:
self.addEventListener('fetch', function(event) {
event.respondWith(
// intercept requests by handling event.request here
);
});
Run Code Online (Sandbox Code Playgroud)
使用第一种方法,我无法拦截来自Web工作者的获取请求.第二种方法不适用于文件URL,我希望我的应用程序通过文件URL工作,因为它允许我通过Electron用于桌面或WebView for Android使用应用程序.有没有其他方法来拦截获取请求?
PS我无法修改我试图拦截请求的工人.
更新:根据@Ciro Corvino的回答,我尝试了第三种方法:在任何其他方面之前启动我自己的工作人员并尝试从那里重新定义提取.不幸的是,这对我不起作用,这里是代码:
function redefineFetch() {
console.log('inside worker');
if …Run Code Online (Sandbox Code Playgroud)