¡Ven a la JSConf España 2026! Comprar entradas

Creando nuestra primera REST API

En esta clase damos un paso fundamental: empezamos a construir nuestra primera REST API real usando Express.

Hasta ahora hemos explorado conceptos de forma aislada: rutas, parámetros dinámicos, query params, filtros y paginación. Ahora es el momento de unificar todo ese conocimiento en una estructura coherente y profesional.

¿Qué es una REST API en este punto?

Aunque el concepto de REST es amplio, en esta etapa del curso nos centraremos en sus pilares básicos:

  • Recursos: Identificamos entidades claras (en este caso, jobs).
  • Endpoints semánticos: Las URLs deben ser intuitivas y seguir una estructura lógica.
  • Formato JSON: Usamos el estándar de la industria para el intercambio de datos.
  • Verbos HTTP: Utilizamos el método correcto para cada acción (empezando por GET para lectura).

Todavía no integraremos bases de datos ni autenticación; nuestro objetivo ahora es dominar el flujo de trabajo y el diseño de la API.

Punto de partida: Datos en memoria

Para mantener la simplicidad y centrarnos en el diseño de los endpoints, seguiremos trabajando con un array de datos simulados:

const jobs = [
  {
    id: 1,
    title: 'Frontend Developer',
    company: 'Data Driven Co',
    location: 'Ciudad de México'
  }
]

1. Listar la colección completa (GET /jobs)

El primer endpoint de nuestra REST API permite obtener todos los recursos de la colección:

app.get('/jobs', (req, res) => {
  // Aquí podríamos aplicar también la lógica de filtrado y paginación vista anteriormente
  return res.json(jobs)
})

Este endpoint es la base de nuestra API. Responde con un código de estado 200 OK (por defecto en Express) y entrega los datos estructurados en JSON.

2. Obtener un recurso individual (GET /jobs/:id)

Para acceder a un empleo concreto, utilizamos un parámetro dinámico en la ruta:

app.get('/jobs/:id', (req, res) => {
  const { id } = req.params

  // Buscamos el empleo por su ID (recuerda convertir el ID a número si es necesario)
  const job = jobs.find(job => job.id === Number(id))

  if (!job) {
    return res.status(404).json({ message: 'Empleo no encontrado' })
  }

  return res.json(job)
})

Detalles clave:

  • Ruta RESTful: Usamos /jobs/:id para identificar un recurso específico.
  • Control de errores: Si el recurso no existe, devolvemos un código 404 Not Found en lugar de una respuesta vacía o un error del servidor.

¿Por qué este paso es tan importante?

Hasta ahora hacíamos pruebas técnicas sueltas. A partir de aquí, dejamos de ver el servidor como “un script que responde cosas” para verlo como una interfaz profesional que puede ser consumida por:

  • Aplicaciones web (React, Vue, Angular).
  • Aplicaciones móviles.
  • Otros servicios de backend.

Lo que hemos aprendido

  • ✅ Cómo unificar filtros, parámetros y respuestas en una API coherente.
  • ✅ La importancia de diseñar rutas que representen recursos.
  • ✅ Cómo manejar la búsqueda de elementos individuales y el error 404.
  • ✅ La transición de “scripts de servidor” a una “arquitectura de API”.

En la siguiente clase vamos a crear un CRUD y explicaremos qué significa.