API REST PostgreSQL
Endpoints CRUD auto-générés depuis le schéma, filtres et tri via syntaxe URL, relations imbriquées via foreign keys, RPC vers fonctions PostgreSQL, RLS appliquée.
API REST auto-générée
Une API REST PostgreSQL est automatiquement générée depuis le schéma de la base de chaque projet Pool C. Dès qu'une table est créée dans public (ou tout schéma exposé), les endpoints CRUD sont disponibles immédiatement, sans aucune configuration ni code à écrire. Les policies RLS PostgreSQL s'appliquent à chaque requête, garantissant que les utilisateurs n'accèdent qu'aux données autorisées.
Quand l'utiliser — quand non
Idéal pour
- CRUD direct depuis une SPA / app mobile
- Filtres et tri complexes via syntaxe URL
- Relations imbriquées (JOIN automatique via foreign keys)
- Appels RPC (functions PostgreSQL)
Pas adapté
- Logique métier complexe — préférer une fonction serverless
- Agrégations lourdes — préférer une view PostgreSQL ou RPC
- Requêtes hors RLS — bypass possible uniquement avec service_role (côté serveur)
Endpoints générés
Pour chaque table public.todos du projet wzfbhd :
GET https://wzfbhd.runtime.di2amp.com/rest/v1/todos Lister / filtrer POST https://wzfbhd.runtime.di2amp.com/rest/v1/todos Insérer PATCH https://wzfbhd.runtime.di2amp.com/rest/v1/todos?id=eq.1 Mettre à jour DELETE https://wzfbhd.runtime.di2amp.com/rest/v1/todos?id=eq.1 Supprimer POST https://wzfbhd.runtime.di2amp.com/rest/v1/rpc/<fn> Appeler une function
L'API est disponible dès la création de la table — aucun redémarrage, aucune migration. Le schéma est rafraîchi automatiquement.
Authentification
# Requête anonyme (rôle anon) curl -L "https://wzfbhd.runtime.di2amp.com/rest/v1/todos" -H "apikey: $ANON_KEY" # Requête authentifiée (JWT user, rôle authenticated) curl -L "https://wzfbhd.runtime.di2amp.com/rest/v1/todos" \ -H "apikey: $ANON_KEY" -H "Authorization: Bearer $USER_TOKEN" # Requête admin (service_role — bypass RLS, côté serveur uniquement) curl -L "https://wzfbhd.runtime.di2amp.com/rest/v1/todos" \ -H "apikey: $SERVICE_ROLE_KEY" -H "Authorization: Bearer $SERVICE_ROLE_KEY"
Filtres et opérateurs
# Égalité, comparaison, LIKE, IN, NULL GET /rest/v1/todos?id=eq.5 GET /rest/v1/todos?priority=gte.3&priority=lt.10 GET /rest/v1/users?email=like.*@example.com GET /rest/v1/todos?status=in.(pending,in_progress) GET /rest/v1/todos?completed_at=is.null # Pagination, tri GET /rest/v1/todos?order=created_at.desc&limit=20&offset=40 # Sélection de colonnes + relations FK (JOIN automatique) GET /rest/v1/orders?select=id,amount,customer(name,email) GET /rest/v1/customers?select=id,name,orders(id,amount,status)
Mutations
# Insertion
curl -L -X POST "https://wzfbhd.runtime.di2amp.com/rest/v1/todos" \
-H "apikey: $ANON_KEY" -H "Authorization: Bearer $USER_TOKEN" \
-H "Content-Type: application/json" -H "Prefer: return=representation" \
-d '{"title":"Acheter du pain","user_id":"550e8400-..."}'
# Mise à jour
curl -L -X PATCH "https://wzfbhd.runtime.di2amp.com/rest/v1/todos?id=eq.42" \
-H "apikey: $ANON_KEY" -H "Authorization: Bearer $USER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"done":true}'
# Suppression (204 No Content)
curl -L -X DELETE "https://wzfbhd.runtime.di2amp.com/rest/v1/todos?id=eq.42" \
-H "apikey: $ANON_KEY" -H "Authorization: Bearer $USER_TOKEN"
Row Level Security
Chaque requête est exécutée sous le rôle PostgreSQL correspondant au JWT (anon, authenticated, service_role). Les policies RLS filtrent les lignes lues / autorisent les écritures.
ALTER TABLE public.todos ENABLE ROW LEVEL SECURITY; CREATE POLICY "read_own_todos" ON public.todos FOR SELECT USING (auth.uid() = user_id); CREATE POLICY "insert_own_todos" ON public.todos FOR INSERT WITH CHECK (auth.uid() = user_id); CREATE POLICY "update_own_todos" ON public.todos FOR UPDATE USING (auth.uid() = user_id); CREATE POLICY "delete_own_todos" ON public.todos FOR DELETE USING (auth.uid() = user_id);
Appel de fonctions PostgreSQL (RPC)
-- Définir une function CREATE OR REPLACE FUNCTION public.get_nearby_places(lat FLOAT, lng FLOAT, radius_km FLOAT) RETURNS SETOF places AS $$ SELECT * FROM places WHERE ST_DWithin(location::geography, ST_MakePoint(lng, lat)::geography, radius_km * 1000) ORDER BY location <-> ST_MakePoint(lng, lat); $$ LANGUAGE SQL STABLE;
curl -L -X POST "https://wzfbhd.runtime.di2amp.com/rest/v1/rpc/get_nearby_places" \
-H "apikey: $ANON_KEY" -H "Content-Type: application/json" \
-d '{"lat":48.8566,"lng":2.3522,"radius_km":5}'
Spécification OpenAPI
L'API génère automatiquement une spécification OpenAPI depuis le schéma PostgreSQL :
GET https://wzfbhd.runtime.di2amp.com/rest/v1/ Authorization: Bearer $ANON_KEY
Importable dans Postman, Insomnia, ou tout outil compatible OpenAPI.
Sécurité et isolation
RLS PostgreSQL en première ligne. La service_role_key bypass toutes les policies — à n'utiliser que côté serveur, jamais embarquée dans une app cliente.
Pour aller plus loin
Tarification associée
Requêtes API incluses jusqu'au quota du plan. Au-delà : facturation à l'usage. Voir tarifs.