假设我在
GET
上使用 https://example.com
请求,响应如下:
This is a response message.
我将如何在我的代码中修改它,以便它可以更改响应以说出这样的内容:
This is a MODIFIED response message.
例如,如果我的 Electron 应用程序要导航到
https://example.com
,屏幕会显示修改后的内容而不是原始内容。
本质上,我正在尝试从字面上修改请求。
我的代码基于这个问题,但它只显示了带有预先输入的
Buffer
的概念证明,因为在我的情况下,我想修改响应而不是直接替换它。所以,我的代码如下所示:
protocol.interceptBufferProtocol("http", (req, CALLBACK) => {
if(req.url.includes("special url here")) {
var request = net.request({
method: req.method,
headers: req.headers,
url: req.url
});
request.on("response", (rp) => {
var d = [];
rp.on("data", c => d.push(c));
rp.on("end", () => {
var e = Buffer.concat(d);
console.log(e.toString());
// do SOMETHING with 'e', the response, then callback it.
CALLBACK(e);
});
});
request.end();
} else {
// Is supposedly going to carry out the request without interception
protocol.uninterceptProtocol("http");
}
}
这应该手动请求 URL、获取响应并返回它。如果没有协议事件,它可以工作并给我一个响应,但经过一些调试后,这段代码始终一遍又一遍地调用相同的 URL,但没有响应。
还有WebRequest API,但是没有办法修改响应体,只能修改请求头&相关内容。
我还没有完全研究基于 Chromium 的解决方案,但在查看 this 之后,我不确定是否可以修改响应,以便它首先出现在我的应用程序端。此外,我不熟悉到处发送的 Chromium/Puppeteer 消息。
有没有一种优雅的方式让 Electron 获取 URL 响应/请求,使用 headers/body/等调用 URL,然后保存并修改响应以在 Electron 中显示不同?
我知道您的协议拦截处理程序会递归调用自身,因为
net.request
会导致同一协议的另一次调用。您可以通过插入结束递归的特殊标头来避免这种情况:
if (req.url.includes("special url here") &&
!req.headers["x-request-interception"]) {
var request = net.request({
method: req.method,
headers: {...req.headers, "x-request-interception": "true"},
url: req.url
});
...
} else {
// Is supposedly going to carry out the request without interception
protocol.uninterceptProtocol("http");
}
}