Spring ResponseEntity gebruiken om de HTTP-respons te manipuleren

1. Inleiding

Met Spring hebben we meestal veel manieren om hetzelfde doel te bereiken, inclusief het verfijnen van HTTP-reacties.

In deze korte zelfstudie zullen we zien hoe u de body, status en headers van een HTTP-antwoord instelt met ResponseEntity.

2. ResponseEntity

ResponseEntityvertegenwoordigt de hele HTTP-reactie: statuscode, headers en body. Als gevolg hiervan kunnen we het gebruiken om de HTTP-respons volledig te configureren.

Als we het willen gebruiken, moeten we het teruggeven vanaf het eindpunt; De lente zorgt voor de rest.

ResponseEntity is een generiek type. Daarom kunnen we elk type als antwoordtekst gebruiken:

@GetMapping ("/ hallo") ResponseEntity hallo () {retourneer nieuwe ResponseEntity ("Hallo wereld!", HttpStatus.OK); }

Omdat we de responsstatus programmatisch specificeren, kunnen we terugkeren met verschillende statuscodes voor verschillende scenario's:

@GetMapping ("/ age") ResponseEntity leeftijd (@RequestParam ("yearOfBirth") int yearOfBirth) {if (isInFuture (yearOfBirth)) {return new ResponseEntity ("Geboortejaar kan niet in de toekomst liggen", HttpStatus.BAD_REQUEST); } retourneer nieuwe ResponseEntity ("Uw leeftijd is" + berekenAge (yearOfBirth), HttpStatus.OK); }

Bovendien kunnen we HTTP-headers instellen:

@GetMapping ("/ customHeader") ResponseEntity customHeader () {HttpHeaders headers = nieuwe HttpHeaders (); headers.add ("Custom-Header", "foo"); retourneer nieuwe ResponseEntity ("Custom header set", headers, HttpStatus.OK); }

Verder ResponseEntitybiedt twee geneste builder-interfaces: HeadersBuilder en zijn subinterface, BodyBuilder. Daarom hebben we toegang tot hun mogelijkheden via de statische methoden van ResponseEntity.

Het eenvoudigste geval is een antwoord met een hoofdtekst en HTTP 200-antwoordcode:

@GetMapping ("/ hallo") ResponseEntity hallo () {return ResponseEntity.ok ("Hallo wereld!"); }

Voor de meest populaire HTTP-statuscodes krijgen we statische methoden:

BodyBuilder geaccepteerd (); BodyBuilder badRequest (); BodyBuilder gemaakt (java.net.URI-locatie); HeadersBuilder noContent (); HeadersBuilder notFound (); BodyBuilder ok ();

Daarnaast kunnen we de BodyBuilder-status (HttpStatus-status) en de BodyBuilder-status (int-status) methoden om een ​​HTTP-status in te stellen.

Eindelijk met ResponseEntity BodyBuilder.body (T-body) we kunnen de hoofdtekst van het HTTP-antwoord instellen:

@GetMapping ("/ age") ResponseEntity leeftijd (@RequestParam ("yearOfBirth") int yearOfBirth) {if (isInFuture (yearOfBirth)) {return ResponseEntity.badRequest () .body ("Geboortejaar kan niet in de toekomst liggen") ; } return ResponseEntity.status (HttpStatus.OK) .body ("Uw leeftijd is" + berekenAge (yearOfBirth)); }

We kunnen ook aangepaste kopteksten instellen:

@GetMapping ("/ customHeader") ResponseEntity customHeader () {return ResponseEntity.ok () .header ("Custom-Header", "foo") .body ("Custom header set"); }

Sinds BodyBuilder.body () geeft een terug ResponseEntity in plaats van Carrosseriebouwer, het zou de laatste oproep moeten zijn.

Merk op dat met HeaderBuilder we kunnen geen eigenschappen van de antwoordtekst instellen.

Bij het terugkeren ResponseEntity bezwaar van de controller, krijgen we mogelijk een uitzondering of fout tijdens het verwerken van het verzoek en zouden we dat graag willen retourneer foutgerelateerde informatie naar de gebruiker die wordt weergegeven als een ander type, laten we zeggen E.

Spring 3.2 biedt ondersteuning voor een globaal @BuienRadarNL met de nieuwe @ControllerAdvice annotatie, die dit soort scenario's afhandelt. Raadpleeg ons bestaande artikel hier voor meer informatie.

Terwijl ResponseEntity is erg krachtig, we moeten het niet te veel gebruiken. In eenvoudige gevallen zijn er andere opties die aan onze behoeften voldoen en die resulteren in veel schonere code.

3. Alternatieven

3.1. @ResponseBody

In klassieke Spring MVC-toepassingen retourneren eindpunten meestal gerenderde HTML-pagina's. Soms hoeven we alleen de feitelijke gegevens te retourneren; bijvoorbeeld wanneer we het eindpunt gebruiken met AJAX.

In dergelijke gevallen kunnen we de aanvraagbehandelingsmethode markeren met @ResponseBody, en Spring behandelt de resultaatwaarde van de methode als de HTTP-antwoordtekst zelf.

Voor meer informatie is dit artikel een goede plek om te beginnen.

3.2. @ResponseStatus

Wanneer een endpoint met succes terugkeert, biedt Spring een HTTP 200 (OK) -respons. Als het eindpunt een uitzondering genereert, zoekt Spring naar een uitzonderingshandler die aangeeft welke HTTP-status moet worden gebruikt.

We kunnen deze methoden markeren met @ResponseStatus, en dus Spring keert terug met een aangepaste HTTP-status.

Ga voor meer voorbeelden naar ons artikel over aangepaste statuscodes.

3.3. Manipuleer de respons direct

Spring geeft ons ook toegang tot het javax.servlet.http.HttpServletResponse rechtstreeks bezwaar maken; we hoeven het alleen als methode-argument te declareren:

@GetMapping ("/ manual") ongeldige handleiding (HttpServletResponse response) gooit IOException {response.setHeader ("Custom-Header", "foo"); response.setStatus (200); response.getWriter (). println ("Hallo wereld!"); }

Aangezien Spring abstracties en aanvullende mogelijkheden biedt boven de onderliggende implementatie, we moeten de reactie niet op deze manier manipuleren.

4. Conclusie

In dit artikel hebben we meerdere manieren besproken om de HTTP-respons in Spring te manipuleren, en hebben we hun voor- en nadelen onderzocht.

Zoals gewoonlijk zijn de voorbeelden beschikbaar op GitHub.