> For the complete documentation index, see [llms.txt](https://books.spartan-cybersec.com/cppj/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://books.spartan-cybersec.com/cppj/appweb-for-juniors/fundamentos-de-apis.md).

# Fundamentos de APIs

Una API (Application Programming Interface) es un conjunto de definiciones y protocolos que permite a una aplicación comunicarse con otra. Las APIs facilitan la integración y permiten que diferentes sistemas intercambien datos y funcionalidades. En el contexto de aplicaciones web, las APIs permiten a los servicios backend comunicarse con frontend y otros servicios externos.

## <mark style="color:green;">**Evolución de las APIs**</mark>

### <mark style="color:green;">**APIs Antiguas**</mark>

Las primeras APIs eran relativamente simples y estaban principalmente basadas en protocolos como SOAP (Simple Object Access Protocol). Estas APIs eran más difíciles de manejar y menos flexibles.

* <mark style="color:green;">**SOAP**</mark><mark style="color:green;">:</mark> Protocolo basado en XML que define cómo dos objetos en diferentes procesos pueden comunicarse por medio de intercambio de información.
* <mark style="color:green;">**Características**</mark><mark style="color:green;">:</mark> Estricta estructura de mensajes, mayores requisitos de configuración.

### <mark style="color:green;">**APIs Modernas**</mark>

Las APIs modernas utilizan principalmente REST (Representational State Transfer) y, más recientemente, GraphQL. Son más flexibles, fáciles de usar y permiten una mejor integración con aplicaciones modernas.

* <mark style="color:green;">**REST**</mark><mark style="color:green;">:</mark> Arquitectura que utiliza HTTP y se basa en operaciones estándar como GET, POST, PUT y DELETE.
* <mark style="color:green;">**GraphQL**</mark><mark style="color:green;">:</mark> Lenguaje de consulta para APIs que permite a los clientes solicitar exactamente los datos que necesitan.

## <mark style="color:green;">**Lenguajes de Programación Relacionados**</mark>

Los lenguajes de programación utilizados para desarrollar APIs incluyen una variedad tanto del lado del servidor como del cliente.

* <mark style="color:green;">**Lado del Servidor**</mark><mark style="color:green;">:</mark> Node.js, Python, Ruby, Java, C#, PHP, Go.
* <mark style="color:green;">**Lado del Cliente**</mark><mark style="color:green;">:</mark> JavaScript, TypeScript.

## <mark style="color:green;">**Comparación: APIs Antiguas vs. Modernas**</mark>

### <mark style="color:green;">**APIs Antiguas**</mark>

* <mark style="color:green;">**Tecnologías**</mark><mark style="color:green;">:</mark> SOAP, XML.
* <mark style="color:green;">**Características**</mark><mark style="color:green;">:</mark> Mensajes estructurados, alta configuración, menos flexibilidad.
* <mark style="color:green;">**Bases de Datos**</mark><mark style="color:green;">:</mark> Integración limitada y específica.

### <mark style="color:green;">**APIs Modernas**</mark>

* <mark style="color:green;">**Tecnologías**</mark><mark style="color:green;">:</mark> REST, GraphQL, JSON.
* <mark style="color:green;">**Características**</mark><mark style="color:green;">:</mark> Flexibilidad, facilidad de uso, estructura ligera, mejor soporte para CRUD (Create, Read, Update, Delete).
* <mark style="color:green;">**Bases de Datos**</mark><mark style="color:green;">:</mark> Integración directa y eficiente con bases de datos SQL y NoSQL.

## <mark style="color:green;">**Relación de las APIs con las Bases de Datos**</mark>

Las APIs son cruciales para la interacción con las bases de datos. Sirven como intermediarios que permiten a las aplicaciones frontend y otros servicios acceder y manipular datos almacenados en bases de datos.

* <mark style="color:green;">**Bases de Datos Relacionales (SQL)**</mark><mark style="color:green;">:</mark> MySQL, PostgreSQL, Oracle.
* <mark style="color:green;">**Bases de Datos NoSQL**</mark><mark style="color:green;">:</mark> MongoDB, Cassandra, CouchDB.

Las APIs utilizan ORM (Object-Relational Mapping) y otras técnicas para interactuar eficientemente con las bases de datos, facilitando operaciones CRUD.

## <mark style="color:green;">**OWASP Top Ten para APIs**</mark>

El OWASP (Open Web Application Security Project) también ha identificado las vulnerabilidades más críticas para las APIs, conocidas como el OWASP API Security Top Ten.

1. <mark style="color:green;">**Broken Object Level Authorization**</mark><mark style="color:green;">:</mark> Acceso no autorizado a objetos sensibles.
2. <mark style="color:green;">**Broken User Authentication**</mark><mark style="color:green;">:</mark> Fallos en los mecanismos de autenticación de usuarios.
3. <mark style="color:green;">**Excessive Data Exposure**</mark><mark style="color:green;">:</mark> Exposición de datos innecesarios en las respuestas de las API.
4. <mark style="color:green;">**Lack of Resources & Rate Limiting**</mark><mark style="color:green;">:</mark> Falta de limitación de recursos y tasa de peticiones.
5. <mark style="color:green;">**Broken Function Level Authorization**</mark><mark style="color:green;">:</mark> Permisos incorrectos en funciones de la API.
6. <mark style="color:green;">**Mass Assignment**</mark><mark style="color:green;">:</mark> Exposición involuntaria de propiedades de objetos a través de entradas de usuario.
7. <mark style="color:green;">**Security Misconfiguration**</mark><mark style="color:green;">:</mark> Configuraciones de seguridad incorrectas o predeterminadas inseguras.
8. <mark style="color:green;">**Injection**</mark><mark style="color:green;">:</mark> Inyecciones SQL, NoSQL, comandos del sistema, etc.
9. <mark style="color:green;">**Improper Assets Management**</mark><mark style="color:green;">:</mark> Mala gestión de versiones y documentación de la API.
10. <mark style="color:green;">**Insufficient Logging & Monitoring**</mark><mark style="color:green;">:</mark> Falta de registros y monitoreo adecuados para detectar y responder a incidentes.

## <mark style="color:green;">**Aplicaciones Monolíticas vs. Microservicios y Functions**</mark>

### <mark style="color:green;">**Monolíticas**</mark>

* <mark style="color:green;">**Definición**</mark><mark style="color:green;">:</mark> Una aplicación monolítica es una aplicación unificada y autónoma en la que todos los componentes están interconectados y gestionados como una sola unidad.
* <mark style="color:green;">**Ventajas**</mark><mark style="color:green;">:</mark> Simplicidad en el desarrollo y despliegue inicial, mejor rendimiento en comunicaciones internas.
* <mark style="color:green;">**Desventajas**</mark><mark style="color:green;">:</mark> Escalabilidad limitada, dificultad para mantener y actualizar, un fallo puede afectar a toda la aplicación.

### <mark style="color:green;">**Microservicios**</mark>

* <mark style="color:green;">**Definición**</mark><mark style="color:green;">:</mark> Arquitectura en la que la aplicación se divide en pequeños servicios independientes que se comunican entre sí a través de APIs.
* <mark style="color:green;">**Ventajas**</mark><mark style="color:green;">:</mark> Escalabilidad, facilidad de mantenimiento, despliegue independiente de servicios.
* <mark style="color:green;">**Desventajas**</mark><mark style="color:green;">:</mark> Complejidad en la gestión de la comunicación entre servicios, sobrecarga operativa.

### <mark style="color:green;">**Functions (Funcionalidad como Servicio - FaaS)**</mark>

* <mark style="color:green;">**Definición**</mark><mark style="color:green;">:</mark> Modelo de computación en la nube que permite a los desarrolladores ejecutar código en respuesta a eventos sin necesidad de gestionar servidores.
* <mark style="color:green;">**Ventajas**</mark><mark style="color:green;">:</mark> Escalabilidad automática, pago por uso, simplicidad en la gestión de infraestructura.
* <mark style="color:green;">**Desventajas**</mark><mark style="color:green;">:</mark> Latencia en el arranque de funciones, dependencia del proveedor de servicios.
