API JSON avec Symfony : répondre en JSON avec les bons codes HTTP
Une API JSON avec Symfony : des routes qui répondent en JSON plutôt qu'en HTML, avec un code HTTP précis pour chaque issue, succès comme refus.
#[Route(format: 'json')] class SoireeController extends AbstractController { #[Route('/api/soirees', name: 'api_soirees', methods: ['GET'])] public function soirees(SoireeRepository $soirees, ClockInterface $horloge): JsonResponse { return $this->json(array_map($this->resume(...), $soirees->findAVenir($horloge->now()))); } } // Refus métier : $this->json(['erreur' => '…'], JsonResponse::HTTP_CONFLICT);
Le client d'une API ne lit pas de page : il lit un statut et un corps. $this->json() passe les données au Serializer et fixe l'en-tête Content-Type ; son deuxième argument porte le code (201 à la création, 409 quand l'état de la ressource empêche l'action, 422 pour des données invalides). format: 'json' sur la route fait aussi sortir en JSON les erreurs levées dans l'action, le 404 d'une soirée inconnue compris. Le piège : passer une entité telle quelle à $this->json(). Le Serializer lit tous ses getters et suit ses relations : il tourne en rond, ou publie ce qui devait rester privé, jusqu'à l'e-mail et au hash du mot de passe d'un employé.
Les exercices font publier la carte de la taverne en JSON, du plat le moins cher au plus cher, puis bâtir l'API des soirées de contes pour les guildes : la liste ouverte à tous, et l'inscription avec ses réponses 201, 401, 404, 409 et 422.
2 exercices font travailler cette notion, en écrivant du code dans le navigateur.
Dans les parcours
- La carte sur parchemin Symfony pour les devs PHP · chapitre 5 : Les parchemins magiques
- Les guildes s'invitent Symfony pour les devs PHP · chapitre 12 : Le grand service