Saltar al contenido principal

Clase 00 — Introducción a las APIs

¿Qué es una API?

API (Application Programming Interface) es un conjunto de reglas y protocolos que permite que dos aplicaciones se comuniquen entre sí.

Pensá en un mesero de restaurante: vos (cliente) le pedís un plato (petición) al mesero (API), él va a la cocina (servidor) y te trae la comida (respuesta).

┌──────────┐      Petición       ┌──────────┐      Consulta      ┌──────────┐
│ Cliente │ ──────────────────► │ API │ ──────────────────► │ Servidor │
│ (tu app) │ ◄────────────────── │ (mesero) │ ◄────────────────── │ (cocina) │
└──────────┘ Respuesta └──────────┘ Resultado └──────────┘

¿Por qué son importantes las APIs?

BeneficioEjemplo
IntegraciónTu app muestra clima usando la API de OpenWeather
AutomatizaciónScript que crea repos en GitHub automáticamente
ReutilizaciónUn backend sirve a web, móvil y CLI
EscalabilidadMicroservicios se hablan entre sí vía APIs
EcosistemaStripe para pagos, Twilio para SMS, AWS para infra

Tipos de APIs

Por acceso

TipoDescripciónEjemplo
Pública (Open)Cualquiera puede usarlaPokéAPI, OpenWeather
Privada (Internal)Solo dentro de la organizaciónAPI de microservicios internos
PartnerSolo socios autorizadosAPIs de proveedores de pago
CompuestaCombina múltiples APIsGateway que agrega datos

Por arquitectura

EstiloProtocoloFormatoUso típico
RESTHTTPJSON/XMLCRUD, web, móvil (el más común)
GraphQLHTTPJSONConsultas flexibles, Facebook
gRPCHTTP/2Protocol BuffersMicroservicios, alto rendimiento
SOAPHTTP/SMTPXMLEmpresarial, legacy, bancos
WebSocketWS/WSSVariadoTiempo real, chat, streaming
WebhookHTTP (push)JSONNotificaciones, eventos

REST — El estándar de la industria

REST (Representational State Transfer) es el estilo más popular. El 90%+ de las APIs modernas son REST.

# REST se basa en:
# 1. Recursos identificados por URLs
# 2. Métodos HTTP estándar (GET, POST, PUT, DELETE)
# 3. Respuestas en JSON (generalmente)
# 4. Sin estado (stateless)

# Ejemplo: Obtener un Pokémon
curl -s https://pokeapi.co/api/v2/pokemon/pikachu | jq '{nombre: .name, id: .id}'
# {"nombre": "pikachu", "id": 25}

Tu primera petición a una API

# 1. API pública sin autenticación
curl -s https://pokeapi.co/api/v2/pokemon/25 | jq '{
id: .id,
nombre: .name,
tipos: [.types[].type.name],
peso_kg: (.weight / 10)
}'

# 2. API de chistes
curl -s https://official-joke-api.appspot.com/random_joke | jq '.'

# 3. Tu IP pública
curl -s https://ipinfo.io | jq '{ip, city, region, country}'

# 4. Datos de un país
curl -s https://restcountries.com/v3.1/name/peru | jq '.[0] | {
nombre: .name.common,
capital: .capital[0],
poblacion: .population,
moneda: (.currencies | keys[0]),
region: .region
}'

Anatomía de una petición API

POST https://api.ejemplo.com/v2/usuarios?activo=true HTTP/1.1

┌─────────────────────────────────────────────────────────────┐
│ Método : POST │
│ Base URL : https://api.ejemplo.com │
│ Versión : /v2 │
│ Recurso : /usuarios │
│ Query : ?activo=true │
│ Protocolo : HTTP/1.1 │
└─────────────────────────────────────────────────────────────┘

Headers:
Content-Type: application/json
Authorization: Bearer eyJhbGciOiJIUz...
Accept: application/json

Body:
{
"nombre": "Ana García",
"email": "ana@dev.com",
"rol": "devops"
}

Anatomía de una respuesta API

HTTP/1.1 201 Created

Headers:
Content-Type: application/json
X-Request-ID: req-12345
X-RateLimit-Remaining: 58
Location: /v2/usuarios/42

Body:
{
"id": 42,
"nombre": "Ana García",
"email": "ana@dev.com",
"rol": "devops",
"creado_en": "2026-02-20T10:00:00Z"
}

APIs en el mundo DevOps

Las APIs están en todos lados en DevOps:

# GitHub API — Gestión de repos, PRs, issues
curl -s https://api.github.com/repos/kubernetes/kubernetes | jq '{stars: .stargazers_count}'

# Docker API — Gestión de contenedores
curl -s --unix-socket /var/run/docker.sock http://localhost/containers/json | jq '.[].Names'

# AWS — Todos los servicios AWS son APIs
aws ec2 describe-instances # → Llama a la API de EC2

# Kubernetes — El cluster entero es una API
kubectl get pods # → Llama a la API de Kubernetes

# Terraform — Provider APIs
terraform apply # → Llama APIs de AWS/GCP/Azure

Herramientas para trabajar con APIs

HerramientaTipoUso
curlCLIPeticiones desde terminal
jqCLIProcesar respuestas JSON
httpieCLIcurl más amigable
PostmanGUIProbar APIs visualmente
InsomniaGUIAlternativa a Postman
Swagger/OpenAPISpecDocumentar APIs
BrunoGUI/CLIOpen source, git-friendly

Ejemplo: Explorar una API desconocida

#!/bin/bash
# explore-api.sh - Explorar una API pública

API_URL="${1:?Uso: $0 <url>}"

echo "=== Explorando: $API_URL ==="

# 1. ¿Responde?
echo "1. Conectividad:"
code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$API_URL")
echo " HTTP: $code"

# 2. Headers de respuesta
echo ""
echo "2. Headers importantes:"
curl -sI --max-time 10 "$API_URL" | grep -iE "^(content-type|server|x-rate)" | sed 's/^/ /'

# 3. Preview del body
echo ""
echo "3. Respuesta (preview):"
body=$(curl -s --max-time 10 "$API_URL")
if echo "$body" | jq '.' &>/dev/null; then
echo "$body" | jq '.' | head -20
else
echo "$body" | head -10
fi

# 4. Tamaño
echo ""
echo "4. Tamaño:"
curl -s -o /dev/null -w " %{size_download} bytes\n" --max-time 10 "$API_URL"

Ejercicios

  1. Hacé una petición a https://pokeapi.co/api/v2/pokemon/pikachu y extraé nombre, tipos y habilidades
  2. Usá https://restcountries.com/v3.1/name/argentina para obtener nombre, capital y población
  3. Hacé peticiones a 3 APIs públicas diferentes y compará sus respuestas
  4. Creá un script que explore una API y muestre: código HTTP, headers, tipo de contenido y preview
  5. Investigá qué APIs usa tu herramienta DevOps favorita (Docker, Kubernetes, GitHub, Terraform)