我正在编写一个 Electron 应用程序,它创建一个 BrowserWindow
。我想捕获发送到服务器的一些请求,我还想要这些请求的响应。使用 Electron WebRequest
api 我无法获得响应,因此搜索网络并发现我可以通过编程方式附加调试器。
我使用下面的代码附加调试器,并且几乎正确地得到了所有响应。但对于一个更大的请求,我无法得到答复。我收到错误
Error: No resource with given identifier found
如果我启动 DevTools 并导航到该请求,我也无法获得响应:无法加载响应数据
。如果我注释掉下面的代码,DevTools 中的响应将正确显示。
请注意,这种情况仅发生在一个特定请求上,该请求会返回大约 1MB 的响应。对于所有其他请求,我可以使用 getResponseData()
获取响应。
const dbg = win.webContents.debugger
var getResponseData = async (reqId) => {
const res = await dbg.sendCommand("Network.getResponseBody", {requestId: reqId});
return res.body
}
try {
dbg.attach('1.3')
dbg.sendCommand('Network.enable')
} catch (err) {
console.log('Debugger attach failed : ', err)
}
dbg.on('detach', async (event, reason) => {
console.log('Debugger detached due to : ', reason)
})
dbg.on('message', (e, m, p) => {
if (m === 'Network.requestWillBeSent') {
if (p.request.url === someURL) {
const j = JSON.parse(p.request.postData)
console.log("req " + p.requestId)
global.webReqs[p.requestId] = { reqData: j}
}
} else if (m === 'Network.loadingFinished') {
if (p.requestId in global.webReqs) {
console.log("res " + p.requestId)
getResponseData(p.requestId).then(res => {
console.log(res.slice(0,60))
}).catch(err => {
console.error(err)
})
}
}
});
简短更新
此特定请求的事件堆栈如下,其中 13548.212
只是 requestId
Network.requestWillBeSentExtraInfo 13548.212
Network.requestWillBeSent 13548.212
Network.responseReceivedExtraInfo 13548.212
Network.responseReceived 13548.212
Network.dataReceived 13548.212 [repeated 135 times]
...
Network.loadingFinished 13548.212
最佳答案
看来我找到了解决方案。这只是一种解决方法,但它确实有效。我没有使用Network.getResponseBody
。我使用了Fetch
(https://chromedevtools.github.io/devtools-protocol/tot/Fetch)。
要使用该功能,需要订阅与模式匹配的响应。然后您可以对 Fetch.requestPaused 事件使用react。在此期间,您可以直接访问请求并间接访问响应。要获取响应,请使用正确的 requestId
调用 Fetch.getResponseBody
。另请记住将 Fetch.continueRequest
发送为
The request is paused until the client responds with one of continueRequest, failRequest or fulfillRequest
https://chromedevtools.github.io/devtools-protocol/tot/Fetch/#event-requestPaused
dbg.sendCommand('Fetch.enable', {
patterns: [
{ urlPattern: interestingURLpattern, requestStage: "Response" }
]})
var getResponseJson = async (requestId) => {
const res = await dbg.sendCommand("Fetch.getResponseBody", {requestId: requestId})
return JSON.parse(res.base64Encoded ? Buffer.from(res.body, 'base64').toString() : res.body)
}
dbg.on('message', (e, m, p) => {
if(m === 'Fetch.requestPaused') {
var reqJson = JSON.parse(p.request.postData)
var resJson = await getResponseJson(p.requestId)
...
await dbg.sendCommand("Fetch.continueRequest", {requestId: p.requestId})
}
});
关于javascript - 连接调试器时 Electron BrowserWindow 无法获得响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66101799/