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
| Palabra | Qué significa |
|---|---|
| Backend | el programa tras una dirección que responde peticiones |
| Ruta | la regla que envía una petición al código que la atiende |
| Manejador | el código que responde un tipo de petición |
| Cadena de consulta | la parte de una dirección tras el signo de interrogación |
| Parámetro | un valor enviado a la base de datos aparte del texto SQL |
| Respuesta | el 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
export PGPASSWORD=shopSe 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
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
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
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
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
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
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
docker logs --tail 30 db 2>&1 | grep -o 'SELECT "public"."books"[^)]*' | tail -1Se 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ón | Qué pide | El SQL que se envió |
|---|---|---|
| /books | La tabla books | FROM "public"."books" |
| available=eq.true | Solo filas donde available es true | WHERE "public"."books"."available" = $1 |
| select=title | Solo la columna title | SELECT "public"."books"."title" |
| order=id | Ordenado por id | ORDER BY "public"."books"."id" |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Lee el valor, enviado aparte
docker logs --tail 30 db 2>&1 | grep -o 'parameters: .*' | tail -1Se 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
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ó
docker logs --tail 30 db 2>&1 | grep -o 'parameters: .*' | tail -1Se 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
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
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.