Salta al contenuto principale

Restituire errori HTTP 4XX in un'applicazione Spring

Spring HTTP
Autore
Harpal Singh
Software Engineer
Tradotto da
Namastecode
Indice dei contenuti

1. Introduzione

In questo breve tutorial, impareremo come restituire errori HTTP 4XX nelle applicazioni Spring.

2. Buoni Codici di Stato HTTP nelle API Restful

Quando progettiamo un’API RESTful, dobbiamo sempre progettare le nostre API in modo che restituiscano una risposta HTTP significativa al client, in modo che l’esito della richiesta sia chiaro. Per gli scenari del percorso felice, l’approccio più semplice è restituire la risposta attesa. In questo caso, Spring imposterà l’intestazione su HTTP 200 per impostazione predefinita. Tuttavia, quando la richiesta fallisce, dobbiamo restituire un codice di stato HTTP appropriato al client. Ad esempio, quando il client invia una richiesta con dati non validi, dovremmo restituire un codice di stato HTTP 4XX Request.

Spring offre diversi modi per restituire la risposta appropriata. Qui, daremo un’occhiata alla classe ResponseEntity.

3. Esempio Negativo di Gestione degli Errori HTTP

Consideriamo un semplice esempio in cui abbiamo un metodo del controller che restituisce il nome di uno studente come stringa:

@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?
}

Sopra, se troviamo lo studente, restituiamo il suo nome; altrimenti, dobbiamo gestire lo scenario di non trovato. Ad esempio, potremmo restituire una stringa di errore:

@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 questo caso, il metodo del controller restituisce un codice di stato HTTP 200, il che potrebbe compromettere la fiducia del cliente poiché la risposta non è quella che si aspettava. Invece, dovremmo restituire un codice di stato HTTP 404 Not Found.

4. Utilizzo di ResponseEntity

Per affrontare questo problema, possiamo utilizzare la classe ResponseEntity. Avvolgendo il tipo di ritorno del metodo del controller in ResponseEntity<?>, possiamo impostare sia il codice di stato HTTP che il corpo della risposta.

Ora, non possiamo restituire una stringa direttamente. Invece, dobbiamo restituire un’istanza di 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();
}

Sopra, utilizziamo il metodo ResponseEntity.ok() per restituire il nome dello studente se viene trovato. Se lo studente non viene trovato, restituiamo un codice di stato HTTP 404 Not Found utilizzando il metodo ResponseEntity.notFound().

A partire da Spring 4.1, la classe ResponseEntity fornisce diversi metodi di supporto per creare istanze di ResponseEntity con diversi codici di stato HTTP. Questo rende il codice più leggibile ed espressivo.

Ad esempio, per restituire un codice di stato HTTP 400 Bad Request, possiamo utilizzare il metodo ResponseEntity.badRequest() oppure decidere di costruire la risposta manualmente:

return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();

5. Vantaggi dell’utilizzo di ResponseEntity

Utilizzare ResponseEntity<?> come tipo di ritorno per i metodi del controller offre diversi vantaggi:

-Flessibilità Permette una maggiore flessibilità nella definizione del codice di stato HTTP e del corpo della risposta. -Leggibilità Il codice è più leggibile ed espressivo, specialmente quando si utilizzano i metodi di supporto. -Coerenza Incoraggia un approccio coerente in tutta l’applicazione per gestire le risposte HTTP.

6. Conclusione

In questo breve articolo, abbiamo imparato come gestire gli errori HTTP 4XX in un’applicazione Spring utilizzando la classe ResponseEntity. Prima, abbiamo spiegato il problema in questione. Poi, abbiamo mostrato l’importanza di restituire codici di stato HTTP corretti nelle API RESTful. Infine, abbiamo dimostrato un esempio di utilizzo della classe ResponseEntity con i suoi metodi di supporto.

Related

Configurare la Porta per un'Applicazione Spring Boot
Spring Basics
Configurare un Client Web Java per Richieste HTTPS
WebClient HTTPS Spring
Come Riprovare Utilizzando Restclient
Spring-Boot Restclient