Brug af Spring ResponseEntity til at manipulere HTTP-responsen

1. Introduktion

Ved hjælp af Spring har vi normalt mange måder at nå det samme mål, herunder finjustering af HTTP-svar.

I denne korte vejledning ser vi, hvordan du indstiller kroppen, status og overskrifter for et HTTP-svar ved hjælp af SvarEnhed.

2. SvarEnhed

SvarEnhedrepræsenterer hele HTTP-svaret: statuskode, overskrifter og brødtekst. Som et resultat kan vi bruge det til fuldt ud at konfigurere HTTP-svaret.

Hvis vi vil bruge det, er vi nødt til at returnere det fra slutpunktet; Foråret tager sig af resten.

SvarEnhed er en generisk type. Derfor kan vi bruge enhver type som responsorgan:

@GetMapping ("/ hej") ResponseEntity hej () {returner ny ResponseEntity ("Hello World!", HttpStatus.OK); }

Da vi angiver svarstatus programmatisk, kan vi vende tilbage med forskellige statuskoder til forskellige 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 ny ResponseEntity ("Din alder er" + calcAge (yearOfBirth), HttpStatus.OK); }

Derudover kan vi indstille HTTP-overskrifter:

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

Desuden, SvarEnhedgiver to indlejrede builder-grænseflader: HeadersBuilder og dens undergrænseflade, BodyBuilder. Derfor kan vi få adgang til deres muligheder gennem de statiske metoder til SvarEnhed.

Den enkleste sag er et svar med en body- og HTTP 200-svarkode:

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

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

BodyBuilder accepteret (); BodyBuilder badRequest (); BodyBuilder oprettet (java.net.URI placering); HeadersBuilder noContent (); HeadersBuilder notFound (); BodyBuilder ok ();

Derudover kan vi bruge BodyBuilder-status (HttpStatus-status) og BodyBuilder-status (int-status) metoder til at indstille enhver HTTP-status.

Endelig med ResponseEntity BodyBuilder.body (T-krop) vi kan indstille 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å indstille brugerdefinerede overskrifter:

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

Siden BodyBuilder.body () returnerer a SvarEnhed i stedet for BodyBuilder, det skulle være det sidste opkald.

Bemærk, at med HeaderBuilder vi kan ikke indstille nogen egenskaber for responsorganet.

Mens du vender tilbage SvarEnhed objekt fra controlleren, får vi muligvis en undtagelse eller fejl under behandlingen af ​​anmodningen og vil gerne returner fejlrelaterede oplysninger til brugeren repræsenteret som en anden type, lad os sige E.

Forår 3.2 bringer støtte til et globalt @ExceptionHandler med det nye @ControllerAdvice kommentar, der håndterer denne slags scenarier. For detaljerede detaljer henvises til vores eksisterende artikel her.

Mens SvarEnhed er meget magtfuld, vi skal ikke bruge det for meget. I enkle tilfælde er der andre muligheder, der tilfredsstiller vores behov, og de resulterer i meget renere kode.

3. Alternativer

3.1. @ResponseBody

I klassiske Spring MVC-applikationer returnerer slutpunkter normalt gengivne HTML-sider. Nogle gange behøver vi kun at returnere de faktiske data; for eksempel når vi bruger slutpunktet med AJAX.

I sådanne tilfælde kan vi markere metoden for anmodningshåndtering med @ResponseBodyog Spring behandler metodens resultatværdi som HTTP-responsorganet sig selv.

For mere information er denne artikel et godt sted at starte.

3.2. @ResponseStatus

Når et slutpunkt vender tilbage, giver Spring et HTTP 200 (OK) svar. Hvis slutpunktet kaster en undtagelse, søger Spring efter en undtagelsesbehandler, der fortæller hvilken HTTP-status, der skal bruges.

Vi kan markere disse metoder med @ResponseStatus og derfor Spring vender tilbage med en tilpasset HTTP-status.

For flere eksempler, se vores artikel om brugerdefinerede statuskoder.

3.3. Manipuler svaret direkte

Foråret giver os også adgang til javax.servlet.http.HttpServletResponse modsætte sig direkte vi behøver kun at erklære det som et metodeargument:

@GetMapping ("/ manual") ugyldig manual (HttpServletResponse svar) kaster IOException {respons.setHeader ("Custom-header", "foo"); respons.setStatus (200); respons.getWriter (). println ("Hej verden!"); }

Da Spring leverer abstraktioner og yderligere kapaciteter over den underliggende implementering, vi skal ikke manipulere svaret på denne måde.

4. Konklusion

I denne artikel diskuterede vi flere måder at manipulere HTTP-svaret i foråret og undersøgte deres fordele og ulemper.

Som sædvanligt er eksemplerne tilgængelige på GitHub.