Bruke Spring ResponseEntity til å manipulere HTTP-responsen

1. Introduksjon

Ved hjelp av Spring har vi vanligvis mange måter å oppnå det samme målet, inkludert finjustering av HTTP-svar.

I denne korte opplæringen vil vi se hvordan du angir kropp, status og overskrifter for et HTTP-svar ved hjelp av ResponseEntity.

2. ResponseEntity

ResponseEntityrepresenterer hele HTTP-responsen: statuskode, overskrifter og brødtekst. Som et resultat kan vi bruke den til å konfigurere HTTP-responsen fullt ut.

Hvis vi vil bruke den, må vi returnere den fra endepunktet; Våren tar seg av resten.

ResponseEntity er en generisk type. Derfor kan vi bruke hvilken som helst type som responsorgan:

@GetMapping ("/ hallo") ResponseEntity hei () {return new ResponseEntity ("Hello World!", HttpStatus.OK); }

Siden vi spesifiserer responsstatusen programmatisk, kan vi returnere med forskjellige statuskoder for forskjellige scenarier:

@GetMapping ("/ age") ResponseEntity age (@RequestParam ("yearOfBirth") int yearOfBirth) {if (isInFuture (yearOfBirth)) {return new ResponseEntity ("Fødselsår kan ikke være i fremtiden", HttpStatus.BAD_REQUEST); } returner nye ResponseEntity ("Din alder er" + calcAge (yearOfBirth), HttpStatus.OK); }

I tillegg kan vi angi HTTP-overskrifter:

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

Dessuten, ResponseEntitygir to nestede byggegrensesnitt: HeadersBuilder og dens undergrensesnitt, BodyBuilder. Derfor kan vi få tilgang til deres evner gjennom de statiske metodene for ResponseEntity.

Det enkleste tilfellet er et svar med en kropps- og HTTP 200-svarskode:

@GetMapping ("/ hallo") ResponseEntity hei () {return ResponseEntity.ok ("Hello World!"); }

For de mest populære HTTP-statuskodene får vi statiske metoder:

BodyBuilder akseptert (); BodyBuilder badRequest (); BodyBuilder opprettet (java.net.URI-sted); HeadersBuilder noContent (); HeadersBuilder notFound (); BodyBuilder ok ();

I tillegg kan vi bruke BodyBuilder-status (HttpStatus-status) og BodyBuilder-status (int-status) metoder for å angi hvilken som helst HTTP-status.

Til slutt, med ResponseEntity BodyBuilder.body (T-kropp) vi kan angi HTTP-responsorganet:

@GetMapping ("/ age") ResponseEntity age (@RequestParam ("yearOfBirth") int yearOfBirth) {if (isInFuture (yearOfBirth)) {return ResponseEntity.badRequest () .body ("Fødselsår kan ikke være i fremtiden") ; } returner ResponseEntity.status (HttpStatus.OK) .body ("Din alder er" + calcAge (yearOfBirth)); }

Vi kan også angi tilpassede overskrifter:

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

Siden BodyBuilder.body () returnerer a ResponseEntity i stedet for BodyBuilder, det skal være den siste samtalen.

Legg merke til at med HeaderBuilder vi kan ikke angi noen egenskaper til responsorganet.

Mens du kommer tilbake ResponseEntity objekt fra kontrolleren, kan det hende at vi får et unntak eller en feil under behandlingen av forespørselen og ønsker å gjøre det returner feilrelatert informasjon til brukeren representert som en annen type, la oss si E.

Våren 3.2 gir støtte til et globalt @ExceptionHandler med det nye @ControllerAdvice kommentar, som håndterer slike scenarier. For detaljerte detaljer, se vår eksisterende artikkel her.

Samtidig som ResponseEntity er veldig kraftig, vi skal ikke bruke det for mye. I enkle tilfeller er det andre alternativer som tilfredsstiller våre behov, og de resulterer i mye renere kode.

3. Alternativer

3.1. @ResponseBody

I klassiske Spring MVC-applikasjoner returnerer endepunkter vanligvis gjengitte HTML-sider. Noen ganger trenger vi bare å returnere de faktiske dataene; for eksempel når vi bruker sluttpunktet med AJAX.

I slike tilfeller kan vi merke metoden for forespørselsbehandler med @ResponseBody, og Våren behandler resultatverdien til metoden som HTTP-responsorgan seg selv.

For mer informasjon er denne artikkelen et godt sted å starte.

3.2. @ResponseStatus

Når et endepunkt returnerer vellykket, gir Spring et HTTP 200 (OK) svar. Hvis endepunktet gir et unntak, ser Spring etter en unntaksbehandler som forteller hvilken HTTP-status du skal bruke.

Vi kan markere disse metodene med @ResponseStatus, og derfor Spring returnerer med en egendefinert HTTP-status.

For flere eksempler, besøk vår artikkel om egendefinerte statuskoder.

3.3. Manipuler svaret direkte

Våren lar oss også få tilgang til javax.servlet.http.HttpServletResponse innvende direkte; vi trenger bare å erklære det som et metodeargument:

@GetMapping ("/ manual") ugyldig manual (HttpServletResponse respons) kaster IOException {respons.setHeader ("Custom-Header", "foo"); respons.setStatus (200); respons.getWriter (). println ("Hello World!"); }

Siden Spring gir abstraksjoner og tilleggsmuligheter over den underliggende implementeringen, vi skal ikke manipulere responsen på denne måten.

4. Konklusjon

I denne artikkelen diskuterte vi flere måter å manipulere HTTP-responsen på våren, og undersøkte fordelene og ulempene.

Som vanlig er eksemplene tilgjengelige på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found