电子操纵/拦截WebView请求和响应

时间:2018-06-21 17:49:06

标签: javascript webview electron

我想创建一个电子应用程序,该应用程序将使用webview显示第三者的内容。

我希望能够拦截来自该Web视图的所有请求和响应。有时我想操纵这些内容,有时我想记录它,而有时我什么也不做。

作为响应的一个示例,也许Web服务器将使用TypeScript代码进行响应,也许我想接受该响应,然后将其编译为标准JavaScript。

我研究了this page,但看来只能取消请求并处理标题。 WebRequest API看起来并不符合我的用例需求,因为它只允许对请求和响应进行非常小的操作。

我还考虑过设置一些可以充当代理的Web服务器,但是对此我感到担心。我想维护用户的隐私,并且要确保托管第3方内容的Web服务器看起来好像请求来自类似环境的浏览器(例如Electron Webview),而不是服务器。我知道我可以使用发送的标头来处理请求,但是整个解决方案变得越来越复杂,所以我想,但这可能是唯一的选择。

有什么更好的方法可以实现这一目标,并且可以更好地控制Electron Webview?

2 个答案:

答案 0 :(得分:4)

我认为您应该研究Protocol API。它在内部用作代理。 说您想让用户打开http://www.google.com并看到类似you've been conned!的内容。

const { protocol } = require("electron");

const content = new Buffer("you've been conned!");

protocol.interceptBufferProtocol("http", (request, result) => {
  if (request.url === "http://www.google.com")
    return result(content);
  ... // fetch other http protocol content and return to the electron
});

WebRequest API相比,

有很多工作要做。但这比独立的本地代理要简单得多。

答案 1 :(得分:2)

要获取您的电子应用程序进行的任何http网络调用的请求正文:

session.defaultSession.webRequest.onBeforeSendHeaders(filter, (details, callback) => {
        if (details.uploadData) {
            const buffer = Array.from(details.uploadData)[0].bytes;
            console.log('Request body: ', buffer.toString());
        }
        callback(details);
      })