Korištenje Spring ResponseEntity za manipulaciju HTTP odgovorom

1. Uvod

Koristeći Spring, obično imamo mnogo načina da postignemo isti cilj, uključujući fino podešavanje HTTP odgovora.

U ovom kratkom vodiču vidjet ćemo kako postaviti tijelo, status i zaglavlja HTTP odgovora pomoću ResponseEntity.

2. ResponseEntity

ResponseEntitypredstavlja cijeli HTTP odgovor: statusni kôd, zaglavlja i tijelo. Kao rezultat toga, možemo ga koristiti za potpuno konfiguriranje HTTP odgovora.

Ako ga želimo koristiti, moramo ga vratiti s krajnje točke; Za ostalo se brine proljeće.

ResponseEntity je generički tip. Slijedom toga, kao odgovor možemo koristiti bilo koju vrstu:

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

Budući da status odgovora specificiramo programski, možemo se vratiti s različitim statusnim kodovima za različite scenarije:

@GetMapping ("/ age") ResponseEntity dob (@RequestParam ("yearOfBirth") int yearOfBirth) {if (isInFuture (yearOfBirth)) {return new ResponseEntity ("Godina rođenja ne može biti u budućnosti", HttpStatus.BAD_REQUEST); } vrati novi ResponseEntity ("Vaša dob je" + izračunaj Starost (yearOfBirth), HttpStatus.OK); }

Uz to možemo postaviti HTTP zaglavlja:

@GetMapping ("/ customHeader") ResponseEntity customHeader () {HttpHeaders headers = new HttpHeaders (); headers.add ("Prilagođeno zaglavlje", "foo"); vrati novi ResponseEntity ("Prilagođeni set zaglavlja", zaglavlja, HttpStatus.OK); }

Nadalje, ResponseEntitypruža dva ugniježđena sučelja graditelja: HeadersBuilder i njegovo podsučelje, Bodibilder. Stoga im možemo pristupiti statičkim metodama ResponseEntity.

Najjednostavniji slučaj je odgovor s tijelom i HTTP 200 kodom odgovora:

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

Za najpopularnije HTTP statusne kodove dobivamo statičke metode:

BodyBuilder prihvaćen (); BodyBuilder badRequest (); Izrađen BodyBuilder (lokacija java.net.URI); HeadersBuilder noContent (); HeadersBuilder notFound (); BodyBuilder ok ();

Osim toga, možemo koristiti Status BodyBuilder-a (HttpStatus status) i Status BodyBuilder (int status) metode za postavljanje bilo kojeg HTTP statusa.

Napokon, sa ResponseEntity BodyBuilder.body (T tijelo) možemo postaviti tijelo HTTP odgovora:

@GetMapping ("/ age") ResponseEntity dob (@RequestParam ("yearOfBirth") int yearOfBirth) {if (isInFuture (yearOfBirth)) {return ResponseEntity.badRequest () .body ("Godina rođenja ne može biti u budućnosti") ; } return ResponseEntity.status (HttpStatus.OK) .body ("Vaša dob je" + izračunaj Starost (yearOfBirth)); }

Također možemo postaviti prilagođena zaglavlja:

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

Od BodyBuilder.body () vraća a ResponseEntity umjesto Bodibilder, trebao bi biti zadnji poziv.

Imajte na umu da sa HeaderBuilder ne možemo postaviti nikakva svojstva tijela odgovora.

Dok se vraćao ResponseEntity objekt od kontrolora, mogli bismo dobiti iznimku ili pogrešku tijekom obrade zahtjeva i htjeli bismo vratiti informacije povezane s pogreškama korisniku predstavljenom kao neki drugi tip, recimo E.

Proljeće 3.2 donosi potporu globalnom @ExceptionHandler s novim @ControllerAdvice napomena, koja rješava ovakve scenarije. Detalje potražite u našem postojećem članku ovdje.

Dok ResponseEntity je vrlo moćan, ne bismo ga trebali pretjerivati. U jednostavnim slučajevima postoje i druge mogućnosti koje zadovoljavaju naše potrebe i rezultiraju mnogo čišćim kodom.

3. Alternative

3.1. @ResponseBody

U klasičnim Spring MVC aplikacijama, krajnje točke obično vraćaju prikazane HTML stranice. Ponekad trebamo vratiti samo stvarne podatke; na primjer, kada koristimo krajnju točku s AJAX-om.

U takvim slučajevima možemo označiti metodu obrade zahtjeva @ResponseBody, i Spring vrijednost rezultata metode tretira kao tijelo HTTP odgovora sebe.

Za više informacija ovaj je članak dobro mjesto za početak.

3.2. @ResponseStatus

Kada se krajnja točka uspješno vrati, Spring pruža HTTP 200 (OK) odgovor. Ako krajnja točka baci iznimku, Spring traži obradu iznimke koja govori koji će HTTP status koristiti.

Te metode možemo označiti s @ResponseStatus, a samim tim i Spring vraća se s prilagođenim HTTP statusom.

Za više primjera posjetite naš članak o prilagođenim kodovima statusa.

3.3. Izravno manipulirajte odgovorom

Proljeće nam također omogućuje pristup javax.servlet.http.HttpServletResponse objekt izravno; moramo ga samo deklarirati kao argument metode:

@GetMapping ("/ manual") void priručnik (HttpServletResponse response) baca IOException {response.setHeader ("Custom-Header", "foo"); response.setStatus (200); response.getWriter (). println ("Pozdrav svijetu!"); }

Budući da Spring pruža apstrakcije i dodatne mogućnosti iznad osnovne implementacije, ne bismo smjeli manipulirati odgovorom na ovaj način.

4. Zaključak

U ovom smo članku raspravljali o više načina manipuliranja HTTP odgovorom u proljeće i ispitali njihove prednosti i nedostatke.

Kao i obično, primjeri su dostupni na GitHubu.