SmartKitio

Programmation

Qu’est-ce qu’une API et comment ça marche ?

Application Programming Interface est un terme large : toute surface définie où un module en appelle un autre. En développement web, on entend surtout une API HTTP — souvent du JSON sur des routes de type REST — où un programme client demande à un programme serveur de lire ou modifier un état partagé. Comprendre ce cycle requête–réponse explique la plupart des bugs d’intégration avant d’ouvrir un débogueur.

9 min de lecture · Mis à jour le 2026-10-04

Câbles réseau et matériel serveur évoquant des systèmes connectés
Photo via Unsplash · Licence Unsplash

Client, serveur et le contrat

Un client initie le travail : JavaScript du navigateur, une app mobile, un cron côté serveur ou un CLI. Un serveur écoute sur le réseau, authentifie l’appelant, valide les entrées, touche des bases ou d’autres services, et renvoie une réponse. L’API est le contrat écrit — URL, méthodes, en-têtes, schémas de corps, formes d’erreur, limites de débit — pas la marque du framework de chaque côté.

Les deux côtés peuvent être des serveurs en pratique : votre app Next.js est cliente quand elle appelle Stripe, et l’API Stripe est le contrat importé depuis la documentation. Les webhooks inversent le sens — le prestataire de paiement devient le client qui POST vers votre endpoint — mais les mêmes règles s’appliquent : vérifier les signatures, analyser le JSON, renvoyer un statut significatif, et rendre les handlers idempotents car les retries sont garantis.

Points de terminaison et ressources

Un endpoint est une méthode plus un chemin (et parfois des règles de requête) qui exécute une opération documentée. Les designs RESTful mappent les chemins vers des noms (/users/42/orders) et utilisent les méthodes HTTP pour exprimer l’intention. Toutes les API publiques ne sont pas strictement REST — des chemins style RPC comme /createInvoice existent encore — mais des URL prévisibles et des champs JSON cohérents réduisent la douleur côté client.

Les query strings filtrent et paginent les collections : GET /v1/articles?tag=api&page=2&limit=20 devrait documenter les défauts, les max et l’ordre de tri. Les paramètres de chemin identifient les ressources (/articles/what-is-an-api) ; les paramètres de requête affinent la demande. Les mélanger de façon incohérente — parfois un id seulement en query — force chaque client à traiter votre API en cas particulier. Documentez quels paramètres sont requis, stables pour le cache, et lesquels changent la forme de réponse.

Méthodes HTTP

Méthodes HTTP courantes dans les API JSON

MéthodeIntention typiqueSûre ?Idempotente ?
GETLire une ressource ou une collectionOuiOui
POSTCréer ou action non idempotenteNonNon
PUTRemplacer une ressource à une URLNonOui
PATCHMise à jour partielleNonSouvent
DELETESupprimer une ressourceNonOui

Sûre signifie que le serveur ne devrait pas changer d’état ; idempotente signifie que répéter la requête ne doit pas multiplier les effets de bord. Cache et logique de retry dépendent de ces sémantiques.

En-têtes : métadonnées lues en premier par le serveur

  • Content-Type indique au serveur comment analyser le corps (application/json).
  • Accept demande du JSON (application/json) ou d’autres représentations.
  • Authorization porte des jetons bearer, clés API ou identifiants spécifiques au schéma.
  • User-Agent, X-Request-ID et en-têtes de trace aident journalisation et support.

Corps et charges JSON

Les GET n’ont en général pas de corps ; POST et PATCH envoient souvent des documents JSON. Les serveurs valident champs requis, types et règles métier avant d’écrire en base. Les clients doivent envoyer du JSON UTF-8 avec le bon Content-Type et ne prettifier qu’en dev — les espaces ne changent pas le sens mais gaspillent des octets. Avant de coller une charge qui échoue dans un ticket, passez-la dans un formateur : une virgule manquante ou une quote typographique depuis un tableur ressemble à un bug serveur jusqu’à ce que le JSON soit valide.

Un appel : requête et réponse

HTTP est d’abord du texte sur le fil : une ligne de requête, des en-têtes, une ligne vide, puis un corps optionnel ; le serveur répond avec une ligne de statut, des en-têtes, une ligne vide et un corps optionnel. Les API JSON gardent les deux côtés lisibles par machine. La requête ci-dessous crée un article ; la réponse renvoie l’enregistrement stocké avec des champs assignés par le serveur.

http
POST /v1/articles HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer eyJhbGciOi…
Accept: application/json
Content-Length: 89

{
  "title": "What Is an API?",
  "slug": "what-is-an-api",
  "published": true
}
http
HTTP/1.1 201 Created
Content-Type: application/json; charset=utf-8
Location: /v1/articles/art_7k2m
Cache-Control: private, max-age=0

{
  "id": "art_7k2m",
  "slug": "what-is-an-api",
  "title": "What Is an API and How Does It Work?",
  "published": true,
  "created": "2026-10-04T14:22:00Z",
  "updated": "2026-10-04T14:22:00Z"
}

Notez comment la réponse reprend les champs client mais ajoute id et horodatages que le client n’a pas envoyés. Un GET /v1/articles/what-is-an-api suivant peut renvoyer 200 avec la même forme JSON ; un PATCH peut n’envoyer que { "published": false } et répondre 200 avec le document mis à jour. Le json-formatter de SmartKitio aide à comparer ces corps côte à côte — noms de champs, imbrication et virgules finales apparaissent tout de suite quand deux environnements divergent.

Les codes de statut résument le résultat

Les codes de statut HTTP sont des résumés à trois chiffres : 2xx succès, 3xx redirection, 4xx erreur client, 5xx panne serveur. Les API renvoient encore des corps d’erreur JSON avec des codes lisibles par machine, mais le statut indique aux intermédiaires et clients génériques comment retry ou mettre en cache. Quand une passerelle renvoie 502 Bad Gateway, le problème peut être en amont ; quand votre app renvoie 422, le JSON a probablement atteint le handler mais a échoué la validation — http-status-lookup clarifie la catégorie pendant que vous lisez le corps.

Codes de statut que vous verrez dans les API JSON

CodeSignificationAction client typique
200 OKSuccès avec corpsAnalyser le JSON ; mettre à jour l’UI
201 CreatedRessource crééeLire le corps ; suivre Location si présent
204 No ContentSuccès, corps videIgnorer JSON.parse ; considérer terminé
400 Bad RequestJSON mal formé ou syntaxe incorrecteCorriger la charge ; ne pas retry identique
401 UnauthorizedAuth manquante ou invalideRafraîchir le jeton ou reconnecter
403 ForbiddenAuth ok, permission refuséeAfficher l’erreur ; ne pas retry comme le même utilisateur
404 Not FoundPas de ressource à ce cheminVérifier l’URL ; peut être un masquage volontaire
409 ConflictDoublon ou conflit de versionFusionner, refetch ou demander à l’utilisateur
422 UnprocessableSchéma ok, règles échouéesAfficher les erreurs de champs du corps
429 Too Many RequestsRate limitBackoff ; respecter Retry-After
500 Internal Server ErrorPanne serveur inattendueRetry avec idempotence ; alerter ops
502 / 503Passerelle ou surchargeRetry plus tard ; consulter la référence de statut

Gestion des erreurs côté client

Les clients robustes traitent les réponses non-2xx comme des résultats à part entière, pas des exceptions noyées dans la console. Lire le statut, puis analyser le JSON si Content-Type est application/json ; certains proxys renvoient encore des pages HTML d’erreur en 502, ce qui fera échouer JSON.parse — cette distinction fait gagner des heures. Les API stables documentent une enveloppe d’erreur : un code string pour les branches programmatiques, un message humain, et des tableaux details optionnels pour la validation.

http
HTTP/1.1 422 Unprocessable Content
Content-Type: application/json

{
  "error": "validation_failed",
  "message": "Slug is already in use",
  "fields": {
    "slug": ["must be unique"]
  }
}

Modèles d’authentification

Les jetons bearer dans l’en-tête Authorization dominent les backends mobile et SPA. OAuth2 et OpenID Connect délèguent la connexion à des fournisseurs d’identité. Les clés API dans les en-têtes sont simples mais fuient facilement depuis les bundles client — préférez des jetons courte durée et un échange côté serveur. Ne mettez jamais de secrets dans les query strings où journaux et Referer les copient ; si une valeur doit être dans une URL, encodez-la en pourcent et traitez-la comme publique.

Cycle de vie d’une requête

Appel API JSON typique
  1. Le client construit l’URL

    Chemin, query (encodée), fragment reste local

  2. DNS + TCP + TLS

    Résoudre l’hôte, connecter, négocier HTTPS

  3. Envoyer la requête HTTP

    Méthode, en-têtes, corps JSON optionnel

  4. Middleware serveur

    Auth, rate limits, logs, routage

  5. Handler + couche données

    Valider l’entrée, interroger la base, appliquer les règles

  6. Réponse

    Statut, en-têtes, corps JSON ou vide

  7. Le client analyse

    JSON.parse, gérer les erreurs, mettre à jour l’UI

Les échecs peuvent survenir à chaque couche — TLS, auth, validation ou logique métier.

Quand un appel échoue, réduisez la couche avant de modifier le code : les erreurs de poignée TLS n’atteignent jamais les analyseurs JSON ; le 401 arrive en middleware avant votre handler ; le 422 signifie que le handler a validé. Capturez la requête brute (méthode, URL, en-têtes, corps) et le statut de réponse sur une ligne de log ou un export HAR, puis validez le JSON en local. Ce workflow explique pourquoi json-formatter et http-status-lookup sont associés dans les outils liés — c’est ainsi que les intégrateurs déboguent vraiment.

REST et autres styles (brièvement)

REST utilise la sémantique HTTP, des serveurs sans état et des URL orientées ressources — toujours le modèle mental par défaut des API HTTP publiques. GraphQL envoie un POST avec un document de requête pour que les clients récupèrent des graphes taillés en un seul aller-retour. gRPC utilise Protocol Buffers sur HTTP/2 pour des microservices internes efficaces. Les webhooks inversent le flux : le serveur POST vers votre URL quand des événements surviennent. Choisissez selon clients, latence et outillage — pas la mode.

Lire un GET réussi

http
GET /v1/articles/what-is-an-api HTTP/1.1
Host: api.example.com
Accept: application/json
Authorization: Bearer eyJhbGciOi…
http
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Cache-Control: private, max-age=60
ETag: "art_7k2m-v3"

{
  "id": "art_7k2m",
  "slug": "what-is-an-api",
  "title": "What Is an API and How Does It Work?",
  "updated": "2026-10-04"
}

Versioning et stabilité

Les API publiques survivent aux applications individuelles. Le versioning indique aux clients quel contrat ils parlent sans figer chaque champ pour toujours. Le motif le plus visible est un préfixe de chemin (/v1/, /v2/) pour que des arbres de routes entiers divergent. Le versioning par en-tête (Accept: application/vnd.company.v2+json) garde des URL stables mais exige des clients disciplinés. Les paramètres de requête (?api-version=2) apparaissent dans journaux et caches — ne les utilisez que si vous acceptez cette visibilité.

  • Documentez un JSON d’erreur stable : code, message, détails par champ optionnels.
  • Préférez les changements additifs : nouveaux champs optionnels et nouveaux endpoints cassent moins que les renommages.
  • Dépréciez avec des en-têtes Sunset ou des dates de coupure documentées ; gardez v1 en lecture seule avant suppression.
  • Les en-têtes Idempotency-Key sur POST aident les retries sûrs pour paiements et créations.
  • Publiez OpenAPI ou JSON Schema pour que les collages json-formatter soient vérifiables contre les mêmes formes que votre serveur valide.

Quand une intégration casse, comparez la requête qui échoue au contrat : méthode, chemin, Content-Type, en-tête auth et clés JSON exactes. Collez corps de requête et réponse dans json-formatter pour repérer un camelCase incohérent ou une string là où le schéma attend un nombre ; associez http-status-lookup quand le statut seul n’explique pas s’il faut corriger client, serveur ou proxy entre les deux.

À retenir

  • Une API est le contrat — URL, méthodes, en-têtes, corps, erreurs — pas le logo du framework sur le dépôt.
  • Toujours lire le statut d’abord, puis analyser le JSON ; tous les corps d’erreur ne sont pas du JSON.
  • Encoder et décoder les URL aux frontières de composants ; les secrets vont dans les en-têtes, pas les query strings.
  • Versionner explicitement ; l’évolution additive bat les ruptures silencieuses.

Le json-formatter et http-status-lookup de SmartKitio sont faits pour la boucle de débogage décrite ici : valider et prettifier les charges en local, puis consulter le code de statut que votre client ou curl a reçu. Utilisez-les avec l’url-encoder quand les paramètres de requête font partie de la requête qui échoue.

Références

  1. RFC 9110 — HTTP Semantics
  2. MDN — An overview of HTTP
  3. OpenAPI Specification

Articles associés