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)