Développement

API REST vs GraphQL — Choisir la bonne architecture

API REST vs GraphQL — Choisir la bonne architecture

Le débat REST vs GraphQL est souvent présenté comme un choix binaire. En réalité, les deux ont leurs forces et leurs faiblesses selon le contexte.

REST — Principes et forces

REST (Representational State Transfer) est basé sur les ressources HTTP.

GET    /articles          → Liste des articles
GET    /articles/42       → Article #42
POST   /articles          → Créer un article
PUT    /articles/42       → Modifier l'article #42
DELETE /articles/42       → Supprimer l'article #42

Avantages REST

  • Cache HTTP natif — Les GET sont cachables par les CDN
  • Simplicité — Facilement compréhensible par tous
  • Tooling mature — Swagger, Postman, etc.
  • Stateless — Pas de session côté serveur

GraphQL — Principes et forces

GraphQL est un langage de requête pour votre API.

query {
  article(id: 42) {
    title
    excerpt
    author {
      name
      avatar
    }
    category {
      name
      color
    }
  }
}

Avantages GraphQL

  • No over-fetching — Vous demandez exactement ce dont vous avez besoin
  • No under-fetching — Une seule requête pour plusieurs ressources
  • Typage fort — Le schema est auto-documenté
  • Parfait pour le mobile — Économise la bande passante

Comparaison directe

Critère REST GraphQL
Courbe d'apprentissage Faible Moyenne
Cache HTTP ✓ Natif Complexe
Over-fetching Fréquent Éliminé
Versionning v1/v2/v3 Schema évolutif
N+1 queries Gérable Attention !
Upload de fichiers Natif Complexe
Real-time Via webhooks Subscriptions

Implémentation Laravel

REST avec Laravel Resources

class ArticleResource extends JsonResource
{
    public function toArray($request): array
    {
        return [
            'id'       => $this->id,
            'title'    => $this->title,
            'excerpt'  => $this->excerpt,
            'author'   => new UserResource($this->whenLoaded('author')),
            'category' => new CategoryResource($this->whenLoaded('category')),
        ];
    }
}

GraphQL avec Lighthouse

# schema.graphql
type Article {
    id: ID!
    title: String!
    content: String!
    author: User! @belongsTo
    category: Category @belongsTo
}

type Query {
    articles: [Article!]! @paginate
    article(id: ID! @eq): Article @find
}

Quand choisir quoi ?

Choisissez REST si :

  • API publique consommée par des tiers
  • Besoins simples CRUD
  • Cache agressif nécessaire
  • Équipe peu familière avec GraphQL

Choisissez GraphQL si :

  • Application mobile avec bande passante limitée
  • Frontend complexe avec des vues très différentes
  • BFF (Backend For Frontend)
  • Agrégation de plusieurs sources de données

La troisième voie : tRPC

Pour les projets full-stack TypeScript, tRPC offre une alternative intéressante : type-safe de bout en bout sans code generation.

// Serveur
export const articleRouter = router({
  list: publicProcedure.query(async () => {
    return db.article.findMany();
  }),
  byId: publicProcedure
    .input(z.object({ id: z.number() }))
    .query(async ({ input }) => {
      return db.article.findUnique({ where: { id: input.id } });
    }),
});

// Client — 100% type-safe automatiquement
const { data } = trpc.article.byId.useQuery({ id: 42 });

// Commentaires (0)

Connectez-vous pour laisser un commentaire.

Aucun commentaire pour le moment.