# data[].attributes.body
CORS (Cross-Origin Resource Sharing) es un mecanismo que utiliza los navegadores y los servidores web para permitir que una aplicación en un dominio (origen) acceda a recursos de otro dominio.

Por defecto, los navegadores limitan las solicitudes HTTP de una aplicación en un dominio a los recursos solo del mismo dominio para evitar ataques de tipo cross-site scripting (XSS). Sin embargo, algunas aplicaciones necesitan acceder a recursos de otros dominios, como una API web o un recurso de un servidor diferente.

CORS permite a los servidores web especificar qué dominios pueden acceder a sus recursos y cómo. Los navegadores luego utilizan esta información para determinar si deben permitir o no una solicitud específica.

Para ello, el servidor puede incluir una cabecera HTTP `Access-Control-Allow-Origin` en su respuesta, que indica los orígenes permitidos. Por ejemplo, si se establece `Access-Control-Allow-Origin: https://example.com`, solo las solicitudes desde ese dominio serán permitidas.

CORS es importante para aplicaciones web que utilizan recursos de varios dominios, y es esencial para aplicaciones de lado cliente que utilizan APIs web de varios proveedores. Sin embargo, también puede presentar problemas de seguridad si no se configura correctamente, por lo que es importante que los desarrolladores comprendan cómo funciona y cómo configurarlo correctamente.

Fuentes:https://developer.mozilla.org/es/docs/Web/HTTP/CORS  y https://youtu.be/YfN9hElekuM

# data[].attributes.headline
Códigos de respuesta de un servidor HTTP

# data[].attributes.subject
Códigos de respuesta de un servidor HTTP

# data[].attributes.body
Los códigos de respuesta HTTP son números de tres dígitos que indican el resultado de una solicitud HTTP. Cada código de respuesta tiene un significado específico y proporciona información sobre el estado de la solicitud.

1. Respuestas informativas (100–199),

2. Respuestas satisfactorias (200–299),

3. Redirecciones (300–399),

4. Errores de los clientes (400–499),

5. y errores de los servidores (500–599).

Fuentes: https://developer.mozilla.org/es/docs/Web/HTTP/Status y https://youtu.be/u2Ms34GE14U

# data[].attributes.headline
¿Cuáles Propiedades son de la cabecera HTTP?

# data[].attributes.subject
¿Cuáles Propiedades son de la cabecera HTTP?

# data[].attributes.body
Las propiedades de la cabecera HTTP son los campos que se incluyen en la parte superior de una solicitud o respuesta HTTP. Estas propiedades proporcionan información adicional sobre la solicitud o respuesta, como el tipo de contenido, la autenticación, la ubicación, la fecha y hora, y muchas otras. Algunas de las propiedades comunes de la cabecera HTTP incluyen:

Accept: Este campo indica los tipos de contenido que el cliente acepta recibir.
Accept-Language: Este campo indica los idiomas que el cliente acepta recibir, sólo se aplica a campos de aplicación que dan soporte a múltiples idiomas. Los valores que se proporcionan (como EN o FR) deben estar soportados por la aplicación.
Authorization: Este campo se utiliza para enviar la información de autenticación al servidor.
Cache-Control: Notifica al solicitante si está habilitado el almacenamiento en memoria caché.
Content-Length: Contiene la longitud de la respuesta.
Content-Type: Notifica al solicitante del formato de la representación que se envía. Por ejemplo, puede especificarse el valor application/xml o application/json.
User-Agent: Este campo indica el navegador o cliente que está realizando la solicitud.
Referer: Este campo indica la URL de la página desde la que se realizó la solicitud.
Cookie: Este campo se utiliza para enviar cookies al servidor.

Existen muchas otras propiedades de cabecera HTTP ademas de las mencionadas, y algunas pueden ser específicas de un lenguaje o protocolo en particular.

Fuente: https://www.ibm.com/docs/es/mam/7.6.1?topic=api-http-header-properties

# data[].attributes.body
Son características de una API REST es que soporta múltiples formatos de representación para transmitir información. Los dos formatos más comunes son JSON (JavaScript Object Notation) y XML (eXtensible Markup Language).

JSON es un formato de texto ligero y fácil de leer que se utiliza para transmitir objetos de JavaScript. Es ampliamente utilizado en aplicaciones web y móviles debido a su facilidad de uso y a la gran cantidad de bibliotecas disponibles en diferentes lenguajes de programación.

XML es un lenguaje de marcas que se utiliza para describir documentos estructurados. Es ampliamente utilizado en aplicaciones empresariales debido a su capacidad para describir datos complejos y su amplia compatibilidad con diferentes sistemas.

Una API REST utiliza clases de serializador para manejar automáticamente la conversión de los objetos de programación en el formato de representación seleccionado. Estas clases se registran en las propiedades del sistema de la API y se utilizan para manejar automáticamente la serialización y deserialización de los objetos.

# data[].attributes.body
REST (Representational State Transfer) es un estilo de arquitectura de software que define un conjunto de principios para diseñar sistemas de software distribuidos. Una API (Application Programming Interface) es un conjunto de reglas y convenciones que se utilizan para interactuar con un sistema o aplicación.

La infraestructura de una API REST (Representational State Transfer) es el conjunto de tecnologías y herramientas necesarias para desarrollar, implementar y mantener una API REST. Algunos de los componentes más comunes incluyen:

1. Servidor web: Es el encargado de recibir las solicitudes HTTP de los clientes y proporcionar las respuestas correspondientes.

2. Lenguaje de programación: Es el lenguaje utilizado para desarrollar el código que ejecuta las acciones necesarias para manejar las solicitudes y generar las respuestas.

3. Base de datos: Es el lugar donde se almacena la información necesaria para responder a las solicitudes de la API. Puede ser una base de datos relacional como MySQL o PostgreSQL, una base de datos NoSQL como MongoDB o Cassandra, o un servicio de base de datos en la nube como Amazon RDS o Google Cloud SQL.

4. Autenticación y autorización: Es el sistema encargado de validar la identidad de los clientes que acceden a la API y controlar qué acciones pueden realizar.

5. Balanceador de carga: Es el componente encargado de distribuir las solicitudes entre varios servidores o instancias de la API para evitar cuellos de botella y mejorar la escalabilidad.

6. Registro y monitoreo: Es el sistema encargado de registrar las acciones que se llevan a cabo en la API y recolectar métricas de rendimiento para detectar problemas y mejorar la calidad del servicio.

API REST se basa en el protocolo HTTP, utiliza los verbos HTTP (GET, POST, PUT, DELETE, etc.) para indicar las acciones a realizar, y utiliza URIs para identificar los recursos. Además, una API RESTful debe ser estable, escalable, y segura.

# data[].attributes.body
HTTP
(Hypertext Transfer Protocol) es un protocolo de red que se utiliza para transmitir información a través de la red. Es el protocolo básico que permite a los navegadores web y aplicaciones móviles solicitar y recibir información de los servidores web.

HTTPS
(HTTP Secure) es una extensión de HTTP que utiliza un protocolo de seguridad adicional, llamado SSL (Secure Sockets Layer) o TLS (Transport Layer Security), para proteger la información transmitida entre el cliente y el servidor. HTTPS asegura que la información transmitida entre el navegador y el servidor web está encriptada y autenticada, lo que evita que terceros intercepten o alteran la información en tránsito.
Para usar HTTPS, es necesario obtener un certificado SSL o TLS para el sitio web y configurar el servidor web para que utilice HTTPS. Una vez configurado, el navegador puede acceder al sitio web utilizando HTTPS y la conexión será segura y encriptada.

Fuente: https://es.godaddy.com/blog/diferencia-entre-http-y-https/

# data[].attributes.headline
Arquitectura modelo vista controlador (MVC)

# data[].attributes.subject
Arquitectura modelo vista controlador (MVC)

# data[].attributes.body
MVC (Model View Controller) es un patrón de diseño de software, una especie de plantilla para resolver un problema que puede ser utilizado en diferentes situaciones.

Model: Almacena y administra datos (Bases de datos).

View: Interfaz gráfica del usuario y lo que interactúa con el usuario, es una representación visual de la información que puede ser manejada de distintas formas.

Controller: Conecta el modelo y la vista según sea necesario, traduce lo que el usuario ingresa en View y aplica la lógica para interpretar qué hacer con esa información y actualiza o regresa la información desde el modelo.

Fuente: https://www.youtube.com/watch?v=UU8AKk8Slqg

# data[].attributes.body
Un ORM (Object-Relational Mapping) es una técnica de programación que permite trabajar con bases de datos relacionales como si fueran objetos de programación.
Nos permite interactuar con nuestra base de datos utilizando un lenguaje de programación sin la necesidad de conocer SQL,  se encargan de traducir nuestras instrucciones en el lenguaje de programación que estemos utilizando a una sentencia de SQL que el gestor de bases de datos que pueda entender.
Para usar un ORM, se debe seleccionar una biblioteca o framework específico para el lenguaje de programación que se está utilizando. Luego, se configura la conexión a la base de datos y se definen las clases de objetos que se utilizarán en el proyecto. Estas clases se relacionan con las tablas de la base de datos a través de anotaciones o configuraciones específicas. Una vez configurado, se pueden realizar operaciones CRUD (create, read, update, delete) sobre los objetos y el ORM se encargará de traducir estas operaciones en consultas SQL y realizar las acciones correspondientes en la base de datos.

Fuente: https://www.youtube.com/watch?v=pKawc1UtVcQ

# data[].attributes.body
Imagina el caso hipotético en el que estas aburrido en casa y tienes pereza de preparar tu comida, afortunadamente tienes un hermano menor al que le puedes pedir cualquier cosa porque es tu hermano menor y sabe cocinar (tu no 😔). Le pides el favor de que te haga algo de comer y extrañamente accede a realizar tu favor; así que mientras tu estas en la cama sin hacer nada y solo habiendo hecho una petición tu hermano  se dirige a la tienda, compra los ingredientes y te prepara la comida, como te dormiste no supiste en que momento regresó y te dio un plato de comida. Pero, ¿Qué relación tiene esto con el manejo de una API?
Supongamos que en términos explicativos tú estarías en le papel de un cliente, necesitabas satisfacer tu necesidad y es por eso que por medio de tu hermano pediste un favor, tu hermano ya sabe qué es lo que tiene que hacer, entonces va a en este caso a la tienda (Servidor externo ya que en ese caso no cuenta con los recursos desde el hogar), compra lo necesario (Solicita los datos), y por último prepara los ingredientes (Transforma la información solicitada) por algo digerible para ti. Al quedarte dormid@ todo eso que hizo tu hermano pasó en un abrir y cerrar de ojos, no sabes cómo lo hizo, pero ahora puedes disfrutar de tu comida.

1. Hacemos una petición.

2. Busca los datos en el Backend (API interna o externa).

3. Traduce la información en algo que el Frontend entienda.

4. Usamos esa información para el propósito deseado.

# data[].attributes.body
Express es un framework web transigente, escrito en JavaScript y alojado dentro del entorno de ejecución NodeJS, a demás de ser uno de los más utilizados.

Express nos brinda algunas funciones para:

Escritura de manejadores de peticiones con diferentes verbos HTTP en diferentes caminos URL (rutas).

Integración con motores de renderización de "vistas" para generar respuestas mediante la introducción de datos en plantillas.

Establecer ajustes de aplicaciones web como qué puerto usar para conectar, y la localización de las plantillas que se utilizan para renderizar la respuesta.

Añadir procesamiento de peticiones "middleware" adicional en cualquier punto dentro de la tubería de manejo de la petición.

También nos permite el uso de MIDDLEWARES, pequeños trozos de código que nos pueden ayudar para cualquier tipo de propósito, ya sea solicitud de autenticación, manejo de cookies, sesiones, cabeceras de seguridad, entre otros.

# data[].attributes.body
En español Marco de trabajo, es aquel que nos ayuda a tener una mejor organización en proyectos de equipo, podríamos explicarlo cono una herramienta o extensión extra al lenguaje de programación que estemos utilizando para facilitar procesos con funciones o clases predeterminadas del Framework al que hagamos uso. Nos hace mantener buenas prácticas y mejor lectura de código ya que todos trabajan bajo la misma lógica

# data[].attributes.body
Es un entorno en tiempo de ejecución multiplataforma para la capa del servidor (en el lado del servidor) basado en JavaScript. Node.js presenta un bucle de eventos como una construcción en tiempo de ejecución en lugar de una biblioteca. Este bucle de eventos es invisible para el usuario.

Ideado como un entorno de ejecución de JavaScript orientado a eventos asíncronos, Node.js está diseñado para crear aplicaciones network escalables. En el siguiente ejemplo de "hola mundo", pueden atenderse muchas conexiones simultáneamente. Por cada conexión, se activa la devolución de llamada o callback, pero si no hay trabajo que hacer, Node.js se dormirá.

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hola Mundo');
});

server.listen(port, hostname, () => {
  console.log(`El servidor se está ejecutando en http://${hostname}:${port}/`);
});

Ejemplos en casos de uso:

Aplicaciones de transmisión de datos (streaming)

Aplicaciones intensivas de datos en tiempo real

Aplicaciones vinculadas a E/S

Aplicaciones basadas en JSON:API

Aplicaciones de página única

Fuente: nodejs.org/es/about/ y itdo.com/blog/que-es-node-js-y-para-que-sirve/

# data[].attributes.body
Es el modelo de comunicación que usamos para comunicarnos desde uno o varios dispositivos a una fuente de información, hablamos de la conexión entre un cliente (dispositivo que necesita de un servidor) y un servidor (proveedor de esta información). Básicamente con ello podemos crear una red en la que vario clientes realicen todo tipo de peticiones al servidor (petición/respuesta).

Fuente: definicion.de/cliente-servidor/

# data[].attributes.body
El Backend es parte de una aplicación  que puede controlar y gestionar toda la información que puede ser usada o solicitada por o para el usuario, este o la puede llegar a ver.

Su funcionamiento
Con el Backend de una aplicación puedes hacer muchas cosas, entre estas:

Acceder a la información que solicitamos: Búsquedas, filtros, seguridad, especificidad, son algunos de los valores que se tienen en cuenta al momento de acceder a esta información.

Combinar información y transformarla: Para entender esta característica planteemos un caso hipotético en el que necesitemos ir de un lugar a otro; la base de datos no solamente buscará en las terminales de buses, también compañías te taxis, metro, y Google maps.

Devolver la información al usuario: Una ves resueltos los anteriores pasos el Backend le puede regresar la información al usuario mediante el manejo de una API (Las APIs son las herramientas encargadas de transportar la información desde el Backend hasta el Frontend, que es donde el proceso final de traducción toma forma) o la interfaz de Frontend de la aplicación.

La subcapa lógica, relacionada con el lenguaje específico: En esta parte el lenguaje de Programación utilizado traduce la información proveniente de la API.

La subcapa visual, relacionada con el diseño estético de la app: La parte del Frontend que el usuario puede ver.

Fuente: mmaglobal.com