1. Introduction
Dans ce tutoriel rapide, nous allons apprendre comment retourner des erreurs HTTP 4XX dans les applications Spring.
2. Bons codes de statut HTTP dans les API Restful
Lors de la conception d’une API RESTful, nous devons toujours concevoir nos APIs de manière à renvoyer une réponse HTTP significative au client, afin que le résultat de la requête soit clair. Pour les scénarios de chemin heureux, l’approche simple consiste à renvoyer la réponse attendue. Dans ce cas, Spring définira par défaut l’en-tête sur HTTP 200. Cependant, lorsque la requête échoue, nous devons renvoyer un code d’état HTTP approprié au client. Par exemple, lorsque le client envoie une requête avec des données invalides, nous devrions renvoyer un code d’état de requête HTTP 4XX.
Spring offre plusieurs façons de renvoyer la réponse appropriée. Ici, nous allons examiner la classe ResponseEntity
.
3. Mauvais exemple de gestion des erreurs HTTP
Considérons un exemple simple où nous avons une méthode de contrôleur qui renvoie le nom d’un étudiant sous forme de chaîne :
@GetMapping(value = "/student/{id}/name")
@ResponseBody
public String getStudentNameById(@PathVariable String id) {
Optional<Student> student = studentService.findById(matchId);
if(student.isPresent()){
return student.get().getName();
}
// --- What to do here?
}
Ci-dessus, si nous trouvons l’étudiant, nous retournons son nom ; sinon, nous devons gérer le scénario où il n’est pas trouvé. Par exemple, nous pourrions retourner une chaîne d’erreur :
@GetMapping(value = "/student/{id}/name")
@ResponseBody
public String getStudentNameById(@PathVariable String id) {
Optional<Student> student = studentService.findById(matchId);
if(student.isPresent()){
return student.get().getName();
}
return "Student not found";
}
Dans ce cas, la méthode du contrôleur renvoie un code de statut HTTP 200, ce qui pourrait rompre la confiance du client, car la réponse n’est pas celle qu’il attendait. Au lieu de cela, nous devrions renvoyer un code de statut HTTP 404 Not Found.
4. Utilisation de ResponseEntity
Pour aborder ce problème, nous pouvons utiliser la classe ResponseEntity
. En enveloppant le type de retour de la méthode du contrôleur dans ResponseEntity<?>
, nous pouvons définir à la fois le code d’état HTTP et le corps de la réponse.
Maintenant, nous ne pouvons pas retourner une chaîne directement. Au lieu de cela, nous devons retourner une instance de ResponseEntity
:
@GetMapping(value = "/student/{id}/name")
public ResponseEntity<?> getStudentNameById(@PathVariable String id) {
Optional<Student> student = studentService.findById(matchId);
if(student.isPresent()){
return ResponseEntity.ok(student.get().getName());
}
return ResponseEntity.notFound().build();
}
Au-dessus, nous utilisons la méthode ResponseEntity.ok()
pour renvoyer le nom de l’étudiant s’il est trouvé. Si l’étudiant n’est pas trouvé, nous renvoyons un code de statut HTTP 404 Not Found en utilisant la méthode ResponseEntity.notFound()
.
À partir de Spring 4.1, la classe ResponseEntity
fournit plusieurs méthodes d’assistance pour créer des instances de ResponseEntity
avec différents codes d’état HTTP. Cela rend le code plus lisible et expressif.
Par exemple, pour renvoyer un code d’état HTTP 400 Bad Request, nous pouvons utiliser la méthode ResponseEntity.badRequest()
ou décider de construire la réponse manuellement :
return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
5. Avantages de l’utilisation de ResponseEntity
L’utilisation de ResponseEntity<?>
comme type de retour pour les méthodes de contrôleur offre plusieurs avantages :
-Flexibilité Cela permet une plus grande flexibilité dans la définition du code d’état HTTP et du corps de la réponse. -Lisibilité Le code est plus lisible et expressif, surtout lorsqu’on utilise les méthodes d’assistance. -Cohérence Cela encourage une approche cohérente à travers votre application pour traiter les réponses HTTP.
6. Conclusion
Dans cet article court, nous avons appris à gérer les erreurs HTTP 4XX dans une application Spring en utilisant la classe ResponseEntity
. Tout d’abord, nous avons expliqué le problème à résoudre. Ensuite, nous avons montré l’importance de renvoyer des codes de statut HTTP corrects dans les API RESTful. Enfin, nous avons démontré un exemple d’utilisation de la classe ResponseEntity
avec ses méthodes d’assistance.