← Retour aux articles
APIAvancé📖 30 min

REST, GraphQL, OpenAPI : Pourquoi Tes APIs Sont Nulles

Conception d'APIs RESTful et GraphQL avec documentation OpenAPI 3.0, versioning sémantique, et gestion des webhooks. Intégration avec les principales plateformes SaaS.

📅 27 décembre 2024⏱️ 30 min
apirestgraphqlopenapiwebhooks
← Retour aux articles
APIAvancé📖 30 min

REST, GraphQL, OpenAPI : Pourquoi Tes APIs Sont Nulles

📅 27 décembre 2024

Design API RESTful

APIs conçues selon les principes REST avec HATEOAS, versioning dans l'URL, et hypermedia controls. Utilisation de JSON:API pour la standardisation.

Principes clés :

  • Ressources : URLs qui représentent des entités (ex: /api/v1/domains)
  • Méthodes HTTP : GET, POST, PUT, PATCH, DELETE utilisés correctement
  • Codes de statut : 2xx succès, 4xx erreurs client, 5xx erreurs serveur
  • HATEOAS : Liens pour naviguer l'API
  • Pagination : Cursor-based pour de grandes listes

Code

/** * @swagger * /api/v1/domains: * get: * summary: Liste des domaines * parameters: * - name: page * in: query * schema: * type: integer * default: 1 * - name: limit * in: query * schema: * type: integer * default: 20 * responses: * 200: * description: Liste des domaines * content: * application/json: * schema: * type: object * properties: * data: * type: array * items: * $ref: '#/components/schemas/Domain' * links: * $ref: '#/components/schemas/PaginationLinks' */

Design d'APIs RESTful avec principes HATEOAS

Design d'APIs RESTful avec principes HATEOAS

GraphQL Schema Design

Schema GraphQL optimisé avec DataLoader pour éviter le N+1 problem, unions pour les types polymorphes, et subscriptions pour le temps réel.

Avantages de GraphQL :

  • Un seul endpoint : /graphql pour toutes les requêtes
  • Client-driven : Le client demande exactement les champs dont il a besoin
  • Type-safe : Schema typé fortement
  • Introspection : Documentation auto-générée
  • Subscriptions : WebSocket pour temps réel

Code

type Query { domains(first: Int, after: String): DomainConnection! domain(id: ID!): Domain user(id: ID!): User }

type DomainConnection { edges: [DomainEdge!]! pageInfo: PageInfo! totalCount: Int! }

type DomainEdge { node: Domain! cursor: String! }

type Domain implements Node { id: ID! name: String! status: DomainStatus! createdAt: DateTime! updatedAt: DateTime! owner: User! records: [DNSRecord!]! }

enum DomainStatus { ACTIVE PENDING SUSPENDED EXPIRED }

Schema GraphQL optimisé avec DataLoader

Schema GraphQL optimisé avec DataLoader