Supabase API REST : Interroger sa Base de Données sans Code Backend

Supabase génère automatiquement une API REST complète pour chaque table de votre base de données, alimentée par PostgREST. Pas besoin d’écrire de routes backend : lisez, créez, modifiez et supprimez des données directement depuis votre frontend.

Pour comprendre les fondations, consultez notre guide complet Supabase. Pour structurer vos tables, voir créer et structurer sa base de données Supabase. Pour sécuriser vos endpoints, voir Supabase RLS. Pour intégrer l’API dans Next.js, voir Supabase avec Next.js. Pour intégrer dans React, voir Supabase avec React.

Comment Fonctionne l’API REST Supabase

Supabase utilise PostgREST, un serveur web qui transforme automatiquement votre base PostgreSQL en API RESTful. Chaque table devient un endpoint accessible via HTTP.

# URL de base de l'API
https://[project-ref].supabase.co/rest/v1/

# Endpoints générés automatiquement
GET    /rest/v1/posts                → Lire tous les posts
POST   /rest/v1/posts                → Créer un post
GET    /rest/v1/posts?id=eq.uuid     → Lire un post spécifique
PATCH  /rest/v1/posts?id=eq.uuid     → Modifier un post
DELETE /rest/v1/posts?id=eq.uuid     → Supprimer un post

SELECT : Lire des données

// Lire tous les posts
const { data, error } = await supabase
  .from('posts')
  .select('*')

// Sélectionner des colonnes spécifiques
const { data } = await supabase
  .from('posts')
  .select('id, title, created_at')

// Jointures (relations)
const { data } = await supabase
  .from('posts')
  .select(`
    id,
    title,
    content,
    profiles (
      username,
      avatar_url
    ),
    categories (
      name,
      slug
    )
  `)

// Compter les résultats
const { data, count } = await supabase
  .from('posts')
  .select('*', { count: 'exact' })
  .limit(10)

Filtres et opérateurs

// Égalité
.eq('status', 'published')

// Comparaisons
.gt('views', 100)   // Greater than
.gte('views', 100)  // Greater than or equal
.lt('views', 100)   // Less than
.lte('views', 100)  // Less than or equal

// IN / NOT IN
.in('status', ['published', 'draft'])

// ILIKE (insensible à la casse)
.ilike('title', '%supabase%')

// Null
.is('deleted_at', null)

// OR
.or('status.eq.published,status.eq.draft')

Tri et pagination

// Tri
.order('created_at', { ascending: false })

// Pagination classique
.range(0, 9)   // Premiers 10 résultats
.range(10, 19) // Page 2

// Limite simple
.limit(20)

// Single result
.single()      // Erreur si 0 ou plusieurs résultats
.maybeSingle() // Null si 0 résultat

INSERT, UPDATE et DELETE

// Insérer un enregistrement
const { data, error } = await supabase
  .from('posts')
  .insert({
    title: 'Mon article',
    content: 'Contenu...',
    user_id: userId
  })
  .select()

// Upsert (créer ou mettre à jour)
const { data, error } = await supabase
  .from('profiles')
  .upsert({
    id: userId,
    username: 'jeandupont',
    updated_at: new Date().toISOString()
  })
  .select()

// Modifier un enregistrement
const { data, error } = await supabase
  .from('posts')
  .update({ title: 'Nouveau titre' })
  .eq('id', postId)
  .select()

// Supprimer
const { error } = await supabase
  .from('posts')
  .delete()
  .eq('id', postId)

Requêtes via HTTP Direct (curl)

# Lire tous les posts publiés
curl 'https://[ref].supabase.co/rest/v1/posts?status=eq.published&select=id,title' \
  -H "apikey: VOTRE_ANON_KEY" \
  -H "Authorization: Bearer VOTRE_JWT"

# Créer un post
curl -X POST 'https://[ref].supabase.co/rest/v1/posts' \
  -H "apikey: VOTRE_ANON_KEY" \
  -H "Authorization: Bearer VOTRE_JWT" \
  -H "Content-Type: application/json" \
  -H "Prefer: return=representation" \
  -d '{"title": "Mon article", "content": "..."}'

Appeler des Fonctions RPC

const { data, error } = await supabase
  .rpc('get_trending_posts', {
    limit_count: 10,
    since_date: '2024-01-01'
  })

Gestion des Erreurs

if (error) {
  switch (error.code) {
    case 'PGRST116': // No rows returned
      console.log('Post non trouvé')
      break
    case '42501': // Insufficient privilege (RLS)
      console.log('Accès refusé')
      break
    case '23505': // Unique violation
      console.log('Doublon détecté')
      break
    default:
      console.error('Erreur:', error.message)
  }
}

👉 Articles du guide Supabase

Cet article fait partie du Guide Complet Supabase 2026. Retrouvez les autres articles :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *