Как я могу назвать относительные URL сервера в прилагаемом приложении Electron? - PullRequest
1 голос
/ 08 октября 2019

Я пытаюсь вызвать API из приложения Electron и не могу найти способ, как правильно это настроить.

Сначала немного контекста. Вариант использования - это веб-SPA, который я хотел бы предложить в качестве настольного приложения с минимальными изменениями в существующей кодовой базе. Я связываю все соответствующие статические файлы, созданные веб-пакетом, в приложение Electron (мои main.js звонки win.loadFile('index.html')), но затем возникают вызовы API для данных. В кодовой базе это легко идентифицируемые URL, начинающиеся с "/ api /". Это прекрасно работает, когда используется в качестве веб-SPA, но завершается неудачно, когда упаковывается в Electron, так как предполагает, что это вызов статического файла.

Документация и существующие потоки StackOverflow по теме редки, но я пытался использовать interceptHttpProtocol/ interceptFileProtocol без особого успеха. Мой первый вопрос: действительно ли это то, что я должен использовать в этом случае, или есть другой механизм?

Если (и это большое, если) я должен использовать эти перехватчики, из документации, которую яне очень понимаю, как они работают. Если я хочу изменить вызов файла на http, я понимаю, что это будет protocol.interceptHttpProtocol('file'...), но я не уверен на 100%. В любом случае, простое выполнение:

protocol.interceptFileProtocol('file', (request, callback) => {
  callback({ path: request.url.substr(7) });
}

(идея здесь заключается в том, чтобы ничего не делать - преобразовать файловый вызов в тот же файловый вызов только для проверки функциональности перехватчика), что приводит к пустой странице и «Не разрешено». загрузить локальный ресурс "ошибка. Если я установлю webSecurity: false, я просто получу пустую страницу без ошибок. Аналогичные результаты с использованием interceptHttpProtocol и ссылки на google.com.

Указатели в правильном направлении очень ценятся.

В качестве плана BI можно использовать переписчики URL-адресов Service Workers или Webpack для изменения URL-адресов по сравнению сАбсолютно, но это было бы чем-то вроде взлома - безусловно, есть «правильный» способ сделать это.

Ответы [ 2 ]

1 голос
/ 09 октября 2019

ОК, этот метод выглядит лучше, чем использование protocol:

session.defaultSession.webRequest.onBeforeRequest((details, callback) => {
  if (details.url.indexOf('file://api./') == 0) { //TODO Change to regex & parametrize (optional - set default value)
    //TODO Test it works with non-GET (should work - using 307 redirect)
    callback({ redirectURL: `http://localhost/${details.url.substr(12)}` }); //TODO Parametrize (mandatory)
  } else {
    callback({}); //TODO Test this works
  }
});

Использование protocol все еще должно быть допустимо, но я думаю, что будет использоваться interceptBufferProtocol:

protocol.interceptBufferProtocol('file', (request, result) => {
  if (request.url.indexOf('file://api./') == 0) {
    return result(new Buffer('{}')); //TODO Call API and return Buffer response (I suppose)
  } else {
    // FIXME What goes here!? As in "just continue doing what you would have done"
  }
});

Я до сих пор не знаю, как решить FIXME там, так что если кто-нибудь может ответить, что это будет высоко ценится.

0 голосов
/ 08 октября 2019

Попробуйте изменить путь следующим образом

path: path.normalize(`${__dirname}/${url}`)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...