Llamadas HTTP REST API en ElectronJS

ElectronJS es un marco de código abierto que se utiliza para crear aplicaciones de escritorio nativas multiplataforma utilizando tecnologías web como HTML, CSS y JavaScript que pueden ejecutarse en los sistemas operativos Windows, macOS y Linux. Combina el motor Chromium y NodeJS en un solo tiempo de ejecución.

Ya conocemos la importancia de las API REST de HTTP en cualquier sistema. Se utilizan en todo el mundo y hay recursos dedicados disponibles en Internet que cubren todo lo relacionado con las API, estándares y protocolos HTTP REST en detalle. Algunos de los recursos más famosos para HTTP REST se mencionan aquí y aquí . NodeJS brinda un amplio soporte para realizar llamadas API REST HTTP a través de módulos integrados y paquetes externos. NodeJS nos proporciona módulos HTTP y HTTPS integrados y algunos de los paquetes npm más famosos utilizados en NodeJS son axios , request y node-fetch.. Dado que Electron es esencialmente una aplicación de Node, todos los paquetes mencionados anteriormente son compatibles y también se pueden usar en Electron. Para obtener un breve tutorial sobre cómo usar el paquete axios en Electron para realizar llamadas a la API REST, consulte el artículo: Información geográfica en ElectronJS . Además de lo anterior, Electron también nos proporciona un módulo de red incorporado para este mismo propósito. El módulo de red se utiliza para emitir requests REST HTTP/HTTPS utilizando la biblioteca de red nativa de Chromium. Este tutorial demostrará cómo realizar llamadas API REST HTTP en Electron utilizando el módulo de red y las ventajas y características del módulo  de red .

Suponemos que está familiarizado con los requisitos previos que se describen en el enlace mencionado anteriormente. Para que Electron funcione, node y npm deben estar preinstalados en el sistema.
El módulo net es una API del lado del cliente en Electron para emitir requests HTTP/HTTPS . Como se mencionó anteriormente, es similar a los módulos HTTP y HTTPS de NodeJS, pero utiliza la biblioteca de red nativa de Chromium en lugar de la implementación de NodeJS y, por lo tanto, ofrece un mejor soporte para servidores proxy web. Algunas otras ventajas del módulo  net son:

  • Gestión automática de la configuración del proxy del sistema, compatibilidad con el protocolo WPAD ( Web Proxy Auto-Discovery ) y archivos de configuración del proxy pac.
  • Tunelización automática de requests HTTPS.
  • Compatibilidad con la autenticación de proxies mediante esquemas de autenticación básicos, de resumen, NTLM, Kerberos o de negociación.
  • Soporte para proxies de monitoreo de tráfico: proxies similares a Fiddler utilizados para control de acceso y monitoreo.
  • Estructura del proyecto: 
     

Project Structure

Ejemplo: Siga los pasos dados en Estilo dinámico en ElectronJS para configurar la aplicación electrónica básica. Copie el código estándar para el archivo main.js y el archivo index.html como se indica en el artículo. Realice también los cambios necesarios mencionados para el archivo package.json para iniciar la aplicación Electron. Continuaremos construyendo nuestra aplicación usando la misma base de código. Los pasos básicos necesarios para configurar la aplicación Electron siguen siendo los mismos. 
paquete.json: 
 

{
  "name": "electron-net",
  "version": "1.0.0",
  "description": "Making HTTP REST API Calls - net Module in Electron ",
  "main": "main.js",
  "scripts": {
    "start": "electron ."
  },
  "keywords": [
    "electron"
  ],
  "author": "Radhesh Khanna",
  "license": "ISC",
  "dependencies": {
    "electron": "^8.3.0"
  }
}

Producción: 

Llamadas HTTP REST API en Electron El módulo de red en Electron es parte del proceso principal . Para importar y usar el módulo de red en el proceso Renderer , usaremos el módulo remoto Electron . En este tutorial, hemos utilizado httpbin.org, que es un servicio de solicitud y respuesta HTTP REST de terceros simple y gratuito. Proporciona ejemplos de API REST HTTP que están disponibles públicamente y no requieren ninguna autenticación ni autorización. También proporciona muchas otras funciones, como pruebas de autenticación, redireccionamientos, cookies, datos dinámicos y aleatorios, etc., a través de API REST de muestra. Haremos HTTP GET y HTTP POSTRequests a este servicio con fines de demostración utilizando el módulo de red . Todos los componentes utilizados en el módulo de red , incluido el diseño y la implementación, como los métodos de instancia, los eventos de instancia y las propiedades de instancia, son similares a la implementación de NodeJS. Este módulo de red solo se puede usar después de que se emita el evento listo del módulo de la aplicación . Este módulo es compatible con todas las plataformas y entornos de SO.

  • index.html : agregue el siguiente fragmento en ese archivo.

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 : los botones Hacer una solicitud GET de muestra y Hacer una solicitud POST de muestra aún no tienen ninguna funcionalidad asociada.

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 occurred')
    });
    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 occurred')
    });
    request.setHeader('Content-Type', 'application/json');
    request.write(body, 'utf-8');
    request.end();
});

Explicación: El módulo de red solo admite un método de instancia. Este método de instancia net.request(options) utiliza la instancia ClientRequest . Cada llamada a este método Instancia crea y devuelve una nueva Instancia ClientRequest . Este método de instancia se utiliza para emitir requests HTTP seguras e inseguras de acuerdo con el esquema de protocolo especificado en el objeto de opciones . Para obtener información más detallada sobre el método net.request() . Toma los siguientes parámetros. 

  • Opciones: el objeto/string Este parámetro puede tomar un objeto o simplemente un valor de string simple . Esto representa las opciones del constructor ClientRequest y se reenvía directamente a la instancia ClientRequest . Si este parámetro es una string , se interpreta como la URL de la solicitud . Si es un objeto , se espera que especifique completamente una solicitud HTTP según lo admita el constructor ClientRequest .

Todos los métodos, eventos y propiedades de la instancia que se usan en el código anterior forman parte de la instancia ClientRequest . La instancia ClientRequest realiza las requests HTTP/HTTPS reales e implementa la interfaz Writable Stream y, por lo tanto, es un EventEmitter . A continuación se proporciona una explicación detallada de las opciones del constructor ClientRequest . Soporta los siguientes parámetros: 

  • Método: este parámetro especifica el método de solicitud HTTP. El valor predeterminado es el método HTTP GET .
  • URL: este parámetro especifica la URL de la solicitud HTTP. Este parámetro debe proporcionarse en forma absoluta con el protocolo especificado como http: o https: . En caso de que no se proporcione el protocolo, no se establece ningún valor predeterminado y, por lo tanto, la solicitud HTTP fallará. Para una solicitud HTTP GET simple , especificar el método y los parámetros de URL son suficientes para realizar la llamada. El parámetro de URL también se puede dividir en otros parámetros.
  • Sesión: este parámetro especifica la instancia de sesión de Electron con la que está asociada la solicitud.
  • Partición: string (opcional) Este parámetro especifica el nombre de la partición derivado de la instancia de sesión con la que está asociada la solicitud. El valor predeterminado es una string vacía . Si el parámetro de sesión y el parámetro de partición se definen juntos, el parámetro de sesión tiene prioridad. Por lo tanto, si se especifica y pasa explícitamente una Instancia de sesión , el parámetro de partición se ignora.
  • useSessionCookies: este parámetro especifica si enviar cookies con esta solicitud derivada de la instancia de sesión . Esto hará que el comportamiento de la cookie de la solicitud de módulos de red coincida con una solicitud de búsqueda de NodeJS . El valor predeterminado es falso .
  • Protocolo: string (opcional) Este parámetro especifica el esquema de protocolo de la solicitud HTTP. Los valores admitidos actualmente son http: o https: . El valor predeterminado es http: . Este parámetro sigue estrictamente el modelo de NodeJS como se describe en el Módulo URL .
  • Host: este parámetro especifica el host del servidor, es decir, la URL base proporcionada como una concatenación del parámetro de nombre de host y el parámetro de número de puerto en el formato de nombre de host:puerto como se indica en los estándares de URL. Este parámetro sigue estrictamente el modelo de NodeJS como se describe en el Módulo URL .
  • Nombre de host: string (opcional) Este parámetro especifica el nombre de host del servidor. Puede ser un nombre de servidor DNS (Servicio de nombres de dominio) o una dirección IP . Este parámetro sigue estrictamente el modelo de NodeJS como se describe en el Módulo URL .
  • Puerto: entero (opcional) Este parámetro especifica el número de puerto de escucha del servidor. Este parámetro sigue estrictamente el modelo de NodeJS como se describe en el Módulo URL .
  • Ruta: string (opcional) Este parámetro especifica la parte de la ruta de la URL de solicitud, es decir, la parte que sigue después de los parámetros de nombre de host/host/puerto de la URL base . Este parámetro puede contener los parámetros de string de consulta o los parámetros de ruta que se deben pasar a la API REST. Los parámetros de string de consulta se definen después de ? Con un par clave-valor en la URL. Este parámetro sigue estrictamente el modelo de NodeJS como se describe en el Módulo URL .
  • redirección: string (opcional) Este parámetro define el modo de redirección para la solicitud HTTP. Puede contener cualquiera de los siguientes valores:
    • seguir Sigue el comportamiento predeterminado de la solicitud HTTP.
    • error Anula cualquiera o todas las redirecciones en la solicitud HTTP.
    • manual Cancela la redirección a menos que el método de instancia request.followRedirect() se invoque sincrónicamente mientras se emite el evento de instancia de redirección .

La instancia ClientRequest admite los siguientes eventos de instancia. 

  • respuesta: evento Este evento de instancia se emite cuando la solicitud HTTP se ha procesado y devuelve una respuesta de la API REST. Este evento de instancia se emite en el objeto de módulo de red (en este caso, objeto de solicitud ). Devuelve una única respuesta: Objeto que representa el paquete de respuesta HTTP entrante que incluye el estado HTTP, los encabezados HTTP, el cuerpo HTTP, etc.
  • finish: Evento Este evento de instancia se emite justo después de que se haya recibido y escrito en el objeto de solicitud la última parte de los datos de la solicitud HTTP .
  • abortar: Evento Este evento de instancia se emite cuando se cancela la solicitud HTTP . Este evento no se emitirá si la solicitud ya está cerrada, es decir, se ha activado el evento Cerrar instancia.
  • error: Evento Este evento de instancia se emite cuando el módulo de red no puede emitir una solicitud de red HTTP, lo que puede ocurrir debido a una variedad de razones, como puerta de enlace incorrecta, sin conexión de red, etc. Por lo general, cuando el objeto de solicitud emite un evento de instancia de error , un evento de instancia cerrada también se emite justo después y no se proporcionará ningún objeto de respuesta . Este evento devuelve un objeto de error que contiene información sobre la falla de la solicitud HTTP, como el código de estado HTTP, etc.
  • cerrar: evento Este evento de instancia se emite como el último evento en la transacción de solicitud-respuesta HTTP después de que se completa el protocolo de enlace. Este evento indica que no se emitirán más eventos en los objetos de solicitud o respuesta y marca la transacción como completa.

Además, la instancia ClientRequest admite una sola propiedad de instancia. 

  • request.chunkedEncoding Esta propiedad de instancia acepta un valor booleano . Esta propiedad especifica si la solicitud HTTP utilizará o no la codificación de transferencia fragmentada HTTP. Esta propiedad solo se puede establecer antes de la primera operación de escritura, es decir, antes del método de instancia request.write() , ya que los encabezados HTTP aún no se han colocado en el cable. Intentar establecer la propiedad chunkedEncoding después de la primera escritura generará un error. El valor predeterminado es falso. Se recomienda encarecidamente usar la propiedad de instancia de codificación fragmentada como verdadera si necesita enviar un cuerpo de solicitud grande, ya que los datos se transmitirán en pequeños fragmentos en lugar de almacenarse en un búfer interno dentro de la memoria de proceso de Electron.

Según las opciones del constructor ClientRequest y los eventos y propiedades de instancia que hemos cubierto hasta ahora, notamos que faltan algunos parámetros críticos para las requests HTTP, como los encabezados y el cuerpo en el caso de la solicitud HTTP POST. Esto se debe a que estos parámetros se eliminaron del objeto de opciones del constructor de las versiones anteriores de Electron y se agregaron como métodos de instancia separados en las versiones más recientes. La instancia ClientRequest admite el siguiente método de instancia. 

  • request.setHeader(nombre, valor) Este método de instancia se usa para agregar un encabezado HTTP adicional o sobrescribir un encabezado existente aparte de los encabezados HTTP predeterminados. El nombre del encabezado se usará tal cual sin minúsculas. Solo se puede llamar antes de la primera escritura, es decir, antes de que se llame al método de instancia request.write() . Llamar a este método después de la primera escritura generará un error. Si el valor pasado no es una string, se llamará a su método toString() para obtener el valor final antes de configurar los encabezados en el paquete de solicitud HTTP.
  • request.getHeader(name) Este método de instancia se utiliza para devolver el valor del encabezado tal como se pasa en el nombre: parámetro de string . El valor devuelto es una string que contiene el valor.
  • request.removeHeader(name) Este método de instancia se utiliza para eliminar el encabezado tal como se pasa en el nombre: parámetro de string . Solo se puede llamar antes de la primera escritura, es decir, antes de que se llame al método de instancia request.write() . Llamar a este método después de la primera escritura generará un error. Este método no devuelve ningún valor.
  • request.write(fragmento, codificación, devolución de llamada) Este método de instancia agrega un fragmento de datos al cuerpo de la solicitud. Este método de instancia es donde configuramos el cuerpo de la solicitud HTTP POST. La primera operación de escritura puede hacer que los encabezados de solicitud se emitan en el cable. Después de la primera operación de escritura, no se permite agregar o eliminar un encabezado personalizado. Toma los siguientes parámetros:
    • chunk: String/Buffer Un fragmento de los datos del cuerpo de la solicitud. Si es un valor de string , se convierte internamente en un búfer utilizando la codificación especificada en el parámetro de codificación .
    • codificación: string (opcional) Este parámetro, como se mencionó anteriormente, se usa para convertir el valor de string del parámetro de fragmento en un objeto de búfer . El valor predeterminado que se usa para la codificación es utf-8, que es la codificación predeterminada que se usa cuando se transfieren requests HTTP por cable.
    • devolución de llamada: función (opcional) Esta función de devolución de llamada es esencialmente una función ficticia introducida con el fin de mantener la similitud con la API de NodeJS. Se llama de forma asíncrona después de que el contenido del fragmento se haya entregado a la capa de red de Chromium.
  • request.abort() Este método de instancia, si se llama, cancela una transacción HTTP en curso. Si el evento de cerrar instancia ya se emitió, este método de instancia no tendrá efecto. De lo contrario , se emiten eventos de anulación y cierre de instancia. Además, si hay un objeto de respuesta en curso , también emitirá el evento de instancia de cancelación.
  • request.followRedirect() Este método de instancia continúa y fuerza a través de cualquier redirección pendiente de la solicitud HTTP. Este método de instancia solo se puede llamar cuando se emite un evento de instancia de redirección .

En este punto, al iniciar la aplicación Electron, deberíamos poder realizar llamadas API REST HTTP exitosas al servicio HTTP httpbin.org , API de muestra GET y POST y verificar las respuestas que estamos obteniendo de estas API. 
Producción: 

Publicación traducida automáticamente

Artículo escrito por radheshkhanna y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *