【问题标题】:Integrating with web services in Electron与 Electron 中的 Web 服务集成
【发布时间】:2015-12-01 16:22:01
【问题描述】:

我是 Electron 的新手,我即将开始使用 Electron/AngularJS 开发桌面应用程序。桌面应用程序只是通过 RESTful Web 服务和 Web 套接字与后端服务器交互的 GUI。

现在我的问题是:在 Electron 中向 Web 服务发出 HTTP 请求并更新 UI 的最佳方式是什么?在普通的网络应用程序中,我只需使用 Angular 的 $http 服务之类的东西直接与网络服务交互。但是,我无法在 Electron 中执行此操作,因为同源策略将阻止请求(据我了解,渲染器在 file:// 源中运行,因此我无法与 mysite.com 通信)。

我想出了几个潜在的解决方案,但它们似乎并不理想:

  • 通过将 BrowserWindow 首选项“web-security”设置为 false,禁用同源策略问题。这似乎不是一个好主意,因为如果我的 UI 代码中有任何类型的跨站点脚本,那么攻击者就可以访问我盒子上的任何文件。

  • 通过 IPC 接口代理我的所有 HTTP 请求。然后主进程就可以不受同源策略的限制,发起 HTTP 请求。不过,这似乎有点矫枉过正。

我是否缺少更简单的解决方案?

【问题讨论】:

    标签: angularjs node.js web-services electron


    【解决方案1】:

    作为替代选项,请考虑在服务器上启用 CORS 并从 client 发出 CORS 请求。

    【讨论】:

      【解决方案2】:

      据我了解,渲染器在 file:// 来源中运行,因此我无法与 mysite.com 通信

      我很确定不是这样,file:// 可以与任何来源通信

      【讨论】:

      • 是的,就是这样。有趣的是,Electron 中的同源策略与 file:// 源中的 Chrome 不同(Chrome 不允许这样做)。
      【解决方案3】:

      view html 文件通过文件协议加载到电子中,而 ajax 在文件协议中不起作用。在我的例子中,我在 html 中设置了一个 IPC 事件发射器,在主进程中设置了一个 IPC 事件处理程序。一旦我需要进行任何 http 调用,我就使用事件发射器,然后从主进程发出 http 请求。请求完成后,我从主进程中创建了另一个 IPC 事件并在 html 中处理它。我不知道这是否是最优雅的方式,但它在我的情况下有效。

      // sample code in the html
      
      <script>
          const ipc = require("electron").ipcRenderer;
      
          function sendAjaxCall(params){
              // handle the params 
              // and make a ipc event to the main process
              ipc.send("call-AJAX", params)
          }
      
          // call the sendAjaxCall function somewhere with proper params
      
          ipc.on("complete-AJAX", function(evt, arg){
              // process your args and handle the return data
          })
      </script>
      
      
      // sample code in the main js file
      
      const ipc = require("electron").ipcMain;
      const request = require("request"); // request is not required, but I found it quite fascinating...
      
      
      ipc.on("call-AJAX", function(evt, arg){
          // process the args and make the ajax call
          request("http://some-url.com/some/endpoint/", function(e, resp, body){
              // handle the response
              // send ipc event to renderer process
              ipc.send("complete-AJAX", resp)
          })
      })
      

      警告 上面的代码只是一些样板代码,可以让您了解基本概念。我在 medium Electron’s IPC Modules and How to Use Them 上找到了一篇很棒的文章,您可以在其中对 IPC 有一些基本的了解。

      更多资源-

      1. ipcMain on Electronjs.org

      2. ipcRenderer on Electronjs.org

      3. Request on npmjs.com

      【讨论】:

        猜你喜欢
        • 2021-02-05
        • 1970-01-01
        • 2016-05-26
        • 2015-10-21
        • 1970-01-01
        • 1970-01-01
        • 2014-09-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多