1. Einführung
In diesem kurzen Tutorial lernen wir, wie wir HTTP 4XX-Fehler in Spring-Anwendungen zurückgeben können.
2. Gute HTTP-Statuscodes in RESTful APIs
Beim Entwerfen einer RESTful API müssen wir unsere APIs so gestalten, dass sie dem Client eine sinnvolle HTTP-Antwort zurückgeben, damit das Ergebnis der Anfrage klar ist. Für die erfolgreichen Szenarien ist der direkte Ansatz, die erwartete Antwort zurückzugeben. In diesem Fall wird Spring standardmäßig den Header auf HTTP 200 setzen. Wenn jedoch die Anfrage fehlschlägt, müssen wir dem Client einen angemessenen HTTP-Statuscode zurückgeben. Zum Beispiel sollten wir, wenn der Client eine Anfrage mit ungültigen Daten sendet, einen HTTP 4XX-Anfragestatuscode zurückgeben.
Spring bietet mehrere Möglichkeiten, um die passende Antwort zurückzugeben. Hier werden wir uns die Klasse ResponseEntity
ansehen.
3. Schlechtes Beispiel für den Umgang mit HTTP-Fehlern
Lassen Sie uns ein einfaches Beispiel betrachten, bei dem wir eine Controller-Methode haben, die den Namen eines Studenten als String zurückgibt:
@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?
}
Oben, wenn wir den Studenten finden, geben wir seinen Namen zurück; andernfalls müssen wir das Szenario behandeln, in dem der Student nicht gefunden wird. Zum Beispiel könnten wir einen Fehlerstring zurückgeben:
@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";
}
In diesem Fall gibt die Controllermethode einen HTTP 200 Statuscode zurück, was das Vertrauen des Clients erschüttern könnte, da die Antwort nicht ihren Erwartungen entspricht. Stattdessen sollten wir einen HTTP 404 Not Found Statuscode zurückgeben.
4. Verwendung von ResponseEntity
Um dieses Problem anzugehen, können wir die ResponseEntity
-Klasse verwenden. Indem wir den Rückgabetyp der Controller-Methode in ResponseEntity<?>
einpacken, können wir sowohl den HTTP-Statuscode als auch den Antwortkörper festlegen.
Nun können wir nicht direkt einen String zurückgeben. Stattdessen müssen wir eine Instanz von ResponseEntity
zurückgeben:
@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();
}
Oben verwenden wir die Methode ResponseEntity.ok()
, um den Namen des Studenten zurückzugeben, wenn er gefunden wird. Wenn der Student nicht gefunden wird, geben wir einen HTTP 404 Not Found-Statuscode mit der Methode ResponseEntity.notFound()
zurück.
Ab Spring 4.1 bietet die Klasse ResponseEntity
mehrere Hilfsmethoden zur Erstellung von Instanzen von ResponseEntity
mit unterschiedlichen HTTP-Statuscodes. Dies macht den Code lesbarer und ausdrucksstärker.
Zum Beispiel können wir, um einen HTTP 400 Bad Request-Statuscode zurückzugeben, die Methode ResponseEntity.badRequest()
verwenden oder uns entscheiden, die Antwort manuell zu erstellen:
return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
5. Vorteile der Verwendung von ResponseEntity
Verwendung von ResponseEntity<?>
als Rückgabetyp für Controllermethoden bietet mehrere Vorteile:
- Flexibilität Es ermöglicht eine größere Flexibilität bei der Definition des HTTP-Statuscodes und des Antwortkörpers.
- Lesbarkeit Der Code ist lesbarer und ausdrucksstärker, besonders bei der Verwendung der Hilfsmethoden.
- Konsistenz Es fördert einen konsistenten Ansatz in Ihrer Anwendung für die Handhabung von HTTP-Antworten.
6. Fazit
In diesem kurzen Artikel haben wir gelernt, wie man HTTP 4XX Fehler in einer Spring-Anwendung mit der ResponseEntity
-Klasse behandelt. Zuerst haben wir das vorliegende Problem erläutert. Dann haben wir die Bedeutung des Zurückgebens korrekter HTTP-Statuscodes in RESTful APIs hervorgehoben. Abschließend haben wir ein Beispiel für die Verwendung der ResponseEntity
-Klasse mit ihren Hilfsmethoden demonstriert.