¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Cómo un backend atiende una petición de API

Después de esta lección: Puedo explicar qué hace un backend con una petición, paso a paso, y mostrarlo preguntando a la base de datos.

Lección de 60 min13 comandosLaboratorio de PostgreSQL y PostgREST: una base de datos y una API REST en el navegador

Qué pasa con una petición en un backend

Un backend es el programa que está detrás de una dirección web y responde peticiones. Lee la petición, decide para qué es, pregunta a los datos y devuelve una respuesta.

Todo backend hace estas tareas, en el lenguaje que sea: analizar, enrutar, comprobar, preguntar a los datos y responder. En esta lección ves cómo lo hace uno.

Al terminar esta lección

Nota

Puedo explicar qué hace un backend con una petición, paso a paso, y mostrarlo preguntando a la base de datos.

Palabras clave

PalabraQué significa
Backendel programa tras una dirección que responde peticiones
Rutala regla que envía una petición al código que la atiende
Manejadorel código que responde un tipo de petición
Cadena de consultala parte de una dirección tras el signo de interrogación
Parámetroun valor enviado a la base de datos aparte del texto SQL
Respuestael estado, las cabeceras y el cuerpo que devuelve un backend

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Cinco pasos de la petición a la respuesta

Primero el backend analiza la petición: su método, su ruta y su cadena de consulta. Después la enruta: averigua para qué manejador es.

El manejador comprueba la petición, pregunta a los datos y responde con un estado y un cuerpo. El backend del laboratorio se llama PostgREST. Sus rutas son las tablas. Crea una tabla para preguntar.

Da a psql la contraseña

Comando
export PGPASSWORD=shop

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Crea la tabla books

Comando
psql -h db -U shop -c "drop table if exists books; create table books (id serial primary key, title text not null, year int not null, available boolean not null default true); insert into books (title, year, available) values ('Mapas del mar', 1998, true), ('Rios de Europa', 2004, false), ('Trenes nocturnos', 2011, true); notify pgrst, 'reload schema'"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Pregunta por una columna que no existe

Comando
curl -s -w "\n" "http://api:3000/books?nope=eq.1"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Una petición imposible da un 400

La respuesta dice que no hay ninguna columna llamada nope, con un 400 y un motivo. El código 42703 es de PostgreSQL: aquí la propia base de datos vio el nombre malo.

Un buen backend lo comprueba antes de preguntar, y así aleja las peticiones malas de los datos. Tu tarea lo hace así.

La cadena de consulta es la pregunta

La dirección /books?available=eq.true&select=title&order=id dice tres cosas. Conserva las filas donde available es true. Devuelve solo la columna title. Ordena las filas por id.

Envíala y después haz tú la misma pregunta a la base de datos en SQL.

Envía la petición

Comando
curl -s -w "\n" "http://api:3000/books?available=eq.true&select=title&order=id"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Haz la misma pregunta en SQL

Comando
psql -h db -U shop -At -c "select title from books where available = true order by id"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Mira al backend preguntar a la base

El backend escribió ese SQL por ti. Para verlo, pide a PostgreSQL que registre cada sentencia que recibe y lee el registro con el docker logs del laboratorio. El ajuste es solo para esta lección, y los últimos Runs lo desactivan.

docker logs funciona solo en un laboratorio que tiene su orden Docker.

Activa el registro de sentencias

Comando
psql -h db -U shop -c "alter system set log_statement = 'all'" -c "select pg_reload_conf()"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Envía otra vez la misma petición

Comando
curl -s -o /dev/null "http://api:3000/books?available=eq.true&select=title&order=id"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Lee el SQL que envió el backend

Comando
docker logs --tail 30 db 2>&1 | grep -o 'SELECT "public"."books"[^)]*' | tail -1

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Ejemplo resuelto: de la petición al SQL

Parte de la peticiónQué pideEl SQL que se envió
/booksLa tabla booksFROM "public"."books"
available=eq.trueSolo filas donde available es trueWHERE "public"."books"."available" = $1
select=titleSolo la columna titleSELECT "public"."books"."title"
order=idOrdenado por idORDER BY "public"."books"."id"

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Lee el valor, enviado aparte

Comando
docker logs --tail 30 db 2>&1 | grep -o 'parameters: .*' | tail -1

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

El valor viaja aparte del SQL

El SQL dice = $1. El valor, t por true, se envió por separado, así que la base de datos lo trata como dato y nunca como SQL. Por eso una petición no puede reescribir la consulta.

Compruébalo. Envía un título que parece un ataque y mira qué hace el backend con él.

Envía un título que parece SQL

Comando
curl -s -G --data-urlencode "title=eq.x'; drop table books; --" -w "\n" "http://api:3000/books"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Mira cómo se pasó

Comando
docker logs --tail 30 db 2>&1 | grep -o 'parameters: .*' | tail -1

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Cuenta los libros

Comando
psql -h db -U shop -At -c "select count(*) from books"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Desactiva otra vez el registro

Comando
psql -h db -U shop -c "alter system reset log_statement" -c "select pg_reload_conf()"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un error frecuente

Advertencia

Mucha gente cree que un backend es solo un tubo entre el navegador y la base de datos. Comprueba, decide y limita. Una respuesta vacía es un 200 sin nada dentro, una petición mala es un 400, y el backend debe distinguirlas.

Más lejos: una pregunta mayor

Escribe una petición del mismo estilo para esta pregunta: los libros disponibles publicados después de 2000, los más nuevos primero, solo título y año. Envíala con curl.

Después escribe el SQL que esperas y lee el registro para comprobarlo.

Sobre este laboratorio y su código: Laboratorio de PostgreSQL y PostgREST: una base de datos y una API REST en el navegador

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.