Skip to content

PostgREST

PostgREST és un servidor web que converteix una base de dades PostgreSQL directament en una API RESTful. Les restriccions estructurals i els permisos de la base de dades determinen els punts finals i les operacions de l’API.

Executa una base de dades postgres:

Terminal window
docker run -d --name postgres --restart=always -p 5432:5432 -e POSTGRES_PASSWORD=password -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=password postgres:17

Crea una base de dades per a la API:

Terminal window
$ docker exec -it postgres psql -U postgres

El primer que fem és crear un esquema amb nom per als objectes de la base de dades que s’exposaran a l’API.

create schema api;

La nostra API tindrà un punt final, /todos, que vindrà d’una taula.

create table api.todos (
id serial primary key,
done boolean not null default false,
task text not null,
due timestamptz
);
insert into api.todos (task) values
('Menjar una poma'), ('Meditar una estona');

A continuació, feu un rol per utilitzar-lo per a sol·licituds web anònimes. Quan arriba una sol·licitud, PostgREST canviarà a aquesta funció a la base de dades per executar consultes.

create role web_anon nologin;
grant usage on schema api to web_anon;
grant select on api.todos to web_anon;

El rol web_anon té permís per accedir als objectes de l’esquema api i per llegir les files de la taula todos.

És una bona pràctica crear un rol dedicat per connectar-se a la base de dades, en lloc d’utilitzar el rol postgres altament privilegiat.

Així que ho farem, anomenarem el rol authenticator i també li donarem la possibilitat de canviar al rol web_anon:

create role authenticator noinherit login password 'password';
grant web_anon to authenticator;

Ara sortiu de psql; és hora d’iniciar l’API!

\q

Executa PostgREST:

Terminal window
docker run --name postgrest --network host -p 3000:3000 -e PGRST_DB_URI=postgres://authenticator:password@localhost:5432/postgres -e PGRST_DB_SCHEMA=api -e PGRST_DB_ANON_ROLE=web_anon postgrest/postgrest

En aquest enllaç tens més paràmetres de configuració: Configuration

Obriu un terminal nou (deixant obert el que s’està executant PostgREST dins).

Prova de fer una sol·licitud HTTP per a todos.

Terminal window
$ curl http://localhost:3000/todos
[{"id":1,"done":false,"task":"Menjar una poma","due":null},
{"id":2,"done":false,"task":"Meditar una estona","due":null}]

Amb els permisos de rol actuals, les sol·licituds anònimes tenen accés només de lectura a la taula todos.

Si intentem afegir un nou “todo”, no podem_

Terminal window
$ curl http://localhost:3000/todos -X POST \
-H "Content-Type: application/json" \
-d '{"task": "do bad thing"}'
{"code":"42501","details":null,"hint":null,"message":"permission denied for table todos"

La resposta és 401 no autoritzada.


El contingut d'aquest lloc web té llicència CC BY-NC-ND 4.0.

©2022-2025 xtec.dev