Zum Hauptinhalt springen

Rückgabe von HTTP 4XX-Fehlern in einer Spring-Anwendung

Spring HTTP
Autor
Harpal Singh
Software Engineer
Übersetzt von
Namastecode
Inhaltsverzeichnis

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.

Verwandte Artikel

Konfigurieren des Ports für eine Spring Boot-Anwendung
Spring Basics
Konfigurieren eines Java Web Clients für HTTPS-Anfragen
WebClient HTTPS Spring
Wie man mit Restclient einen Retry durchführt
Spring-Boot Restclient