Вызовы HTTP REST API в ElectronJS

Опубликовано: 29 Июля, 2021

ElectronJS - это платформа с открытым исходным кодом, используемая для создания кроссплатформенных нативных настольных приложений с использованием веб-технологий, таких как HTML, CSS и JavaScript, которые могут работать в операционных системах Windows, macOS и Linux. Он объединяет движок Chromium и NodeJS в единую среду выполнения.

Мы уже знаем о важности HTTP REST API в любой системе. Они используются повсюду во всем мире, и в Интернете доступны специальные ресурсы, которые подробно охватывают все, что касается HTTP REST API, стандартов и протоколов. Некоторые из наиболее известных ресурсов по HTTP REST упомянуты здесь и здесь. NodeJS предоставляет обширную поддержку для выполнения вызовов HTTP REST API через встроенные модули и внешние пакеты. NodeJS предоставляет нам встроенные модули HTTP и HTTPS, а некоторые из самых известных пакетов npm, используемых в NodeJS, - это axios, request и node-fetch. Поскольку Electron по сути является приложением Node, все вышеупомянутые пакеты поддерживаются и также могут использоваться в Electron. Краткое руководство по использованию пакета axios в Electron для выполнения вызовов REST API см. В статье: Географическая информация в ElectronJS. В дополнение к вышесказанному, Electron также предоставляет нам встроенный сетевой модуль именно для этой цели. Модуль net используется для выдачи запросов HTTP / HTTPS REST с использованием собственной сетевой библиотеки Chromium. В этом руководстве будет показано, как выполнять вызовы HTTP REST API в Electron с использованием модуля net, а также преимущества и особенности модуля net.

Мы предполагаем, что вы знакомы с предварительными условиями, описанными в вышеупомянутой ссылке. Для работы Electron в системе должны быть предварительно установлены node и npm.
Модуль net - это клиентский API в Electron для выдачи запросов HTTP / HTTPS. Как упоминалось выше, он похож на модули HTTP и HTTPS в NodeJS, но использует собственную сетевую библиотеку Chromium вместо реализации NodeJS и, следовательно, предлагает лучшую поддержку веб-прокси. Некоторые другие преимущества сетевого модуля:

  • Автоматическое управление конфигурацией системного прокси, поддержка протокола WPAD ( Web Proxy Auto-Discovery ) и файлов конфигурации pac прокси.
  • Автоматическое туннелирование HTTPS-запросов.
  • Поддержка аутентификации прокси с использованием базовой, дайджест-схемы, NTLM, Kerberos или согласованных схем аутентификации.
  • Поддержка прокси для мониторинга трафика: прокси-серверы, подобные Fiddler, используются для контроля доступа и мониторинга.

  • Структура проекта:

Пример: следуйте инструкциям в разделе «Динамическое стилирование в ElectronJS», чтобы настроить базовое приложение Electron. Скопируйте код Boilerplate для файлов main.js и index.html, как указано в статье. Также внесите необходимые изменения, упомянутые в файле package.json, чтобы запустить приложение Electron. Мы продолжим создавать наше приложение, используя ту же кодовую базу. Основные шаги, необходимые для настройки приложения Electron, остаются прежними.
package.json:

 {
  "имя": "электрон-сеть",
  "версия": "1.0.0",
  "description": "Выполнение вызовов HTTP REST API - сетевой модуль в Electron",
  "main": "main.js",
  "scripts": {
    "старт": "электрон".
  },
  "ключевые слова": [
    "электрон"
  ],
  «автор»: «Радхеш Ханна»,
  "лицензия": "ISC",
  "dependencies": {
    "электрон": "^ 8.3.0"
  }
}

Выход:

Вызовы HTTP REST API в Electron Модуль net в Electron является частью основного процесса . Чтобы импортировать и использовать сетевой модуль в процессе рендеринга , мы будем использовать удаленный модуль Electron. В этом руководстве мы использовали httpbin.org, который представляет собой простую и бесплатную стороннюю службу запросов и ответов HTTP REST. Он предоставляет образцы HTTP REST API, которые общедоступны и не требуют аутентификации и авторизации. Он также предоставляет множество других функций, таких как тесты аутентификации, перенаправления, файлы cookie, динамические и рандомизированные данные и т. Д., Через образцы REST API. Мы будем делать HTTP- запросы GET и HTTP POST для этой службы в демонстрационных целях с использованием модуля net. Все компоненты, используемые в сетевом модуле, включая дизайн и реализацию, такие как методы экземпляра, события экземпляра и свойства экземпляра, аналогичны реализации NodeJS. Этот сетевой модуль можно использовать только после того, как будет сгенерировано событие готовности модуля приложения. Этот модуль поддерживается на всех платформах и средах ОС.

  • index.html : добавьте в этот файл следующий фрагмент.

html




< h3 >Making HTTP REST API Calls
using net Module in Electron
</ h3 >
< button id = "get" >
Make Sample GET Request
</ button >
< br >< br >
< button id = "post" >
Make Sample POST Request
</ button >
<!-- Adding Individual Renderer
Process JS File -->
< script src = "index.js" ></ script >
  • index.js : кнопки «Сделать образец GET-запроса» и « Сделать образец POST-запроса» еще не имеют связанных с ними функций.

javascript




const electron = require( 'electron' );
// Importing the net Module from electron remote
const net = electron.remote.net;
var get = document.getElementById( 'get' );
get.addEventListener( 'click' , () => {
const request = net.request({
method: 'GET' ,
protocol: 'http:' ,
hostname: 'httpbin.org' ,
path: '/get' ,
redirect: 'follow'
});
request.on( 'response' , (response) => {
console.log(`STATUS: ${response.statusCode}`);
console.log(`HEADERS: ${JSON.stringify(response.headers)}`);
response.on( 'data' , (chunk) => {
console.log(`BODY: ${chunk}`)
});
});
request.on( 'finish' , () => {
console.log( 'Request is Finished' )
});
request.on( 'abort' , () => {
console.log( 'Request is Aborted' )
});
request.on( 'error' , (error) => {
console.log(`ERROR: ${JSON.stringify(error)}`)
});
request.on( 'close' , (error) => {
console.log( 'Last Transaction has occured' )
});
request.setHeader( 'Content-Type' , 'application/json' );
request.end();
});
var post = document.getElementById( 'post' );
post.addEventListener( 'click' , () => {
var body = JSON.stringify({ key: 1 });
const request = net.request({
method: 'POST' ,
protocol: 'http:' ,
hostname: 'httpbin.org' ,
path: '/post' ,
redirect: 'follow'
});
request.on( 'response' , (response) => {
console.log(`STATUS: ${response.statusCode}`);
console.log(`HEADERS: ${JSON.stringify(response.headers)}`);
response.on( 'data' , (chunk) => {
console.log(`BODY: ${chunk}`)
});
});
request.on( 'finish' , () => {
console.log( 'Request is Finished' )
});
request.on( 'abort' , () => {
console.log( 'Request is Aborted' )
});
request.on( 'error' , (error) => {
console.log(`ERROR: ${JSON.stringify(error)}`)
});
request.on( 'close' , (error) => {
console.log( 'Last Transaction has occured' )
});
request.setHeader( 'Content-Type' , 'application/json' );
request.write(body, 'utf-8' );
request.end();
});

Объяснение: Сетевой модуль поддерживает только один метод экземпляра. Этот метод экземпляра net.request (options) использует экземпляр ClientRequest. Каждый вызов этого метода экземпляра создает и возвращает новый экземпляр ClientRequest. Этот метод экземпляра используется для отправки как безопасных, так и небезопасных HTTP-запросов в соответствии со схемой протокола, указанной в объекте параметров. Для получения более подробной информации о методе net.request () . Он принимает следующие параметры.

  • Параметры: объект / строка. Этот параметр может принимать объект или просто значение строки. Он представляет параметры конструктора ClientRequest и напрямую пересылается экземпляру ClientRequest. Если этот параметр является строкой , он интерпретируется как URL-адрес запроса. Если это объект , ожидается, что он полностью определит HTTP-запрос, поддерживаемый конструктором ClientRequest.

Все методы, события и свойства экземпляра, используемые в приведенном выше коде, являются частью экземпляра ClientRequest. Экземпляр ClientRequest выполняет фактические запросы HTTP / HTTPS и реализует интерфейс Writable Stream и, следовательно, является EventEmitter. Подробное объяснение параметров конструктора ClientRequest приведено ниже. Он поддерживает следующие параметры:

  • Метод: этот параметр указывает метод HTTP-запроса. По умолчанию используется метод HTTP GET.
  • URL: этот параметр указывает URL-адрес HTTP-запроса. Этот параметр должен быть указан в абсолютной форме с протоколом, указанным как http: или https:. Если протокол не указан, значение по умолчанию не установлено, и, следовательно, HTTP-запрос не будет выполнен. Для простого запроса HTTP GET для вызова достаточно указать метод и параметры URL. Параметр URL также может быть разделен на другие параметры.
  • Session: этот параметр указывает экземпляр электронного сеанса, с которым связан запрос.
  • Partition: String (Необязательно) Этот параметр указывает имя раздела, производное от экземпляра сеанса, с которым связан запрос. Значение по умолчанию - пустая строка . Если параметр сеанса и параметр раздела определены вместе, параметр сеанса имеет приоритет. Таким образом, если экземпляр сеанса явно указан и передан, параметр раздела игнорируется.
  • useSessionCookies: этот параметр указывает, следует ли отправлять файлы cookie с этим запросом, полученным из экземпляра сеанса. Это приведет к тому, что поведение cookie запроса сетевых модулей будет соответствовать запросу извлечения NodeJS. Значение по умолчанию - false .
  • Протокол: String (Необязательно) Этот параметр указывает схему протокола HTTP-запроса. В настоящее время поддерживаются значения http: или https:. Значение по умолчанию - http:. Этот параметр строго следует модели NodeJS, как описано в модуле URL.
  • Хост: этот параметр указывает хост сервера, то есть базовый URL-адрес, представленный как объединение параметра имени хоста и параметра номера порта в формате имя хоста: порт, как указано в стандартах URL. Этот параметр строго следует модели NodeJS, как описано в модуле URL.
  • Имя хоста: String (Необязательно) Этот параметр указывает имя хоста сервера. Это может быть имя сервера DNS (службы доменных имен) или IP- адрес. Этот параметр строго следует модели NodeJS, как описано в модуле URL.
  • Порт: целое число (необязательно). Этот параметр указывает номер порта прослушивания сервера. Этот параметр строго следует модели NodeJS, как описано в модуле URL.
  • Путь: String (Необязательно) Этот параметр указывает часть пути URL-адреса запроса, т. Е. Часть, которая следует после параметров имени хоста / хоста / порта базового URL-адреса. Этот параметр может содержать параметры строки запроса или параметры пути , которые необходимо передать в REST API. Параметры строки запроса определяются после символа ? С парой "ключ-значение" в URL-адресе. Этот параметр строго следует модели NodeJS, как описано в модуле URL.
  • redirect: String (Необязательно) Этот параметр определяет режим перенаправления для HTTP-запроса. Он может содержать любое из следующих значений:
    • follow Следит за поведением HTTP-запроса по умолчанию.
    • error Прерывает любое или все перенаправления в HTTP-запросе.
    • manual Отменяет перенаправление, если только метод экземпляра request.followRedirect () не вызывается синхронно во время генерации события экземпляра перенаправления.

Экземпляр ClientRequest поддерживает следующие события экземпляра.

  • response: Event Это событие экземпляра генерируется после обработки HTTP-запроса и возвращает ответ от REST API. Это событие экземпляра испускается в объекте сетевого модуля (в данном случае - в объекте запроса ). Он возвращает один ответ: объект, который представляет входящий пакет ответа HTTP, который включает статус HTTP, заголовки HTTP, тело HTTP и т. Д.
  • finish: Event Это событие экземпляра генерируется сразу после того, как последний фрагмент данных HTTP-запроса был получен и записан в объект запроса.
  • abort: Event Это событие экземпляра генерируется, когда HTTP- запрос прерывается. Это событие не будет сгенерировано, если запрос уже закрыт, т. Е. Было запущено событие close Instance.
  • error: Event Это событие экземпляра генерируется, когда сетевой модуль не может отправить сетевой запрос HTTP, что может произойти из-за множества причин, таких как плохой шлюз, отсутствие сетевого подключения и т. д. Обычно, когда объект запроса выдает событие экземпляра ошибки, событие close Instance также генерируется сразу после этого, и никакой объект ответа предоставлен не будет. Это событие возвращает объект ошибки, который содержит некоторую информацию об ошибке HTTP-запроса, такую как код состояния HTTP и т. Д.
  • close: Event Это событие экземпляра генерируется как последнее событие в транзакции HTTP-запрос-ответ после завершения рукопожатия. Это событие указывает, что никакие дальнейшие события не будут генерироваться ни для объектов запроса, ни для объектов ответа, и помечает транзакцию как завершенную.

Кроме того, экземпляр ClientRequest поддерживает единственное свойство экземпляра.

  • request.chunkedEncoding Это свойство экземпляра принимает логическое значение. Это свойство указывает, будет ли HTTP-запрос использовать кодировку фрагментированной передачи HTTP или нет. Это свойство может быть установлено только перед первой операцией записи, то есть перед методом экземпляра request.write (), поскольку заголовки HTTP еще не переданы по сети. Попытка установить свойство chunkedEncoding после первой записи приведет к ошибке. Значение по умолчанию неверно. Настоятельно рекомендуется использовать свойство chunkedEncoding Instance как true , если вам нужно отправить большое тело запроса, поскольку данные будут передаваться небольшими порциями вместо внутренней буферизации в памяти процесса Electron.

Основываясь на параметрах конструктора ClientRequest , а также на событиях и свойствах экземпляра, которые мы рассмотрели до сих пор, мы замечаем, что некоторые важные параметры для HTTP-запросов отсутствуют, такие как заголовки и тело в случае HTTP-запроса POST. Это связано с тем, что эти параметры были удалены из объекта параметров конструктора из предыдущих версий Electron и добавлены как отдельные методы экземпляра в более новых версиях. Экземпляр ClientRequest поддерживает следующий метод экземпляра.

  • request.setHeader (name, value) Этот метод экземпляра используется для добавления дополнительного заголовка HTTP или перезаписи существующего заголовка отдельно от заголовков HTTP по умолчанию. Имя заголовка будет использоваться без нижнего регистра. Его можно вызвать только перед первой записью, то есть перед вызовом метода экземпляра request.write (). Вызов этого метода после первой записи вызовет ошибку. Если переданное значение не является String, его метод toString () будет вызван для получения окончательного значения перед установкой заголовков в пакете HTTP-запроса.
  • request.getHeader (name) Этот метод экземпляра используется для возврата значения заголовка, переданного в параметре name: String . Возвращаемое значение - это строка, содержащая значение.
  • request.removeHeader (name) Этот метод экземпляра используется для удаления заголовка, переданного в параметре name: String . Его можно вызвать только перед первой записью, то есть перед вызовом метода экземпляра request.write (). Вызов этого метода после первой записи вызовет ошибку. Этот метод не возвращает никаких значений.
  • request.write (chunk, encoding, callback) Этот метод экземпляра добавляет фрагмент данных в тело запроса. В этом методе экземпляра мы устанавливаем тело HTTP-запроса POST. Первая операция записи может вызвать отправку заголовков запроса по сети. После первой операции записи нельзя добавлять или удалять настраиваемый заголовок. Принимает следующие параметры:
    • chunk: String / Buffer Фрагмент данных тела запроса. Если это значение String , оно внутренне преобразуется в буфер с использованием кодировки, указанной в параметре кодирования.
    • Кодирование: Строка (необязательно) Этот параметр , как упоминалось выше, используется для преобразования значения параметра Строка фрагмент в объект буфера. Значение по умолчанию, используемое для кодировки - utf-8, которая является кодировкой по умолчанию, используемой при передаче HTTP-запросов по сети.
    • callback: Function (необязательно) Эта функция обратного вызова по сути является фиктивной функцией, введенной с целью сохранения сходства с API NodeJS. Он вызывается асинхронно после того, как содержимое блока было доставлено на сетевой уровень Chromium.
  • request.abort () Этот метод экземпляра, если он вызван, отменяет текущую транзакцию HTTP. Если событие закрытия экземпляра уже создано, этот метод экземпляра не будет иметь никакого эффекта. Иначе генерируются события прерывания и закрытия экземпляра. Кроме того, если есть текущий объект ответа , он также вызовет событие прерывания экземпляра.
  • request.followRedirect () Этот метод экземпляра продолжает и принудительно выполняет любое ожидающее перенаправление HTTP-запроса. Этот метод экземпляра может быть вызван только при возникновении события экземпляра перенаправления.

На этом этапе, после запуска приложения Electron, мы должны иметь возможность совершать успешные вызовы HTTP REST API к HTTP-сервису httpbin.org , API GET и POST Sample и проверять ответы, которые мы получаем от этих API.
Выход: