Annotazioni RequestBody e ResponseBody di Spring

1. Introduzione

In questo breve tutorial, forniamo una panoramica concisa delle annotazioni Spring @RequestBody e @ResponseBody .

2. @RequestBody

In poche parole, l' annotazione @RequestBody mappa il corpo di HttpRequest su un oggetto di trasferimento o dominio, consentendo la deserializzazione automatica del corpo HttpRequest in entrata su un oggetto Java.

Per prima cosa, diamo un'occhiata a un metodo del controller Spring:

@PostMapping("/request") public ResponseEntity postController( @RequestBody LoginForm loginForm) { exampleService.fakeAuthenticate(loginForm); return ResponseEntity.ok(HttpStatus.OK); }

Spring deserializza automaticamente il JSON in un tipo Java, assumendo che ne sia specificato uno appropriato.

Per impostazione predefinita, il tipo che annotiamo con l' annotazione @RequestBody deve corrispondere al JSON inviato dal nostro controller lato client:

public class LoginForm { private String username; private String password; // ... }

Qui, l'oggetto che utilizziamo per rappresentare le mappe del corpo HttpRequest al nostro oggetto LoginForm .

Proviamo questo usando CURL:

curl -i \ -H "Accept: application/json" \ -H "Content-Type:application/json" \ -X POST --data '{"username": "johnny", "password": "password"}' "//localhost:8080/.../request"

Questo è tutto ciò di cui abbiamo bisogno per un'API REST di Spring e un client Angular che utilizzi l' annotazione @ RequestBody .

3. @ResponseBody

L' annotazione @ResponseBody indica a un controller che l'oggetto restituito viene serializzato automaticamente in JSON e ritrasmesso nell'oggetto HttpResponse .

Supponiamo di avere un oggetto Response personalizzato :

public class ResponseTransfer { private String text; // standard getters/setters }

Successivamente, il controller associato può essere implementato:

@Controller @RequestMapping("/post") public class ExamplePostController { @Autowired ExampleService exampleService; @PostMapping("/response") @ResponseBody public ResponseTransfer postResponseController( @RequestBody LoginForm loginForm) { return new ResponseTransfer("Thanks For Posting!!!"); } }

Nella console per sviluppatori del nostro browser o utilizzando uno strumento come Postman, possiamo vedere la seguente risposta:

{"text":"Thanks For Posting!!!"}

Ricorda, non abbiamo bisogno di annotare i controller annotati @ RestController con l' annotazione @ResponseBody poiché Spring lo fa per impostazione predefinita.

3.1. Impostazione del tipo di contenuto

Quando usiamo l' annotazione @ResponseBody , siamo ancora in grado di impostare esplicitamente il tipo di contenuto restituito dal nostro metodo.

Per questo, possiamo usare la @RequestMapping 's produce attributo. Tieni presente che annotazioni come @PostMapping , @GetMapping , ecc. Definiscono gli alias per quel parametro.

Aggiungiamo ora un nuovo endpoint che invia una risposta JSON:

@PostMapping(value = "/content", produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public ResponseTransfer postResponseJsonContent( @RequestBody LoginForm loginForm) { return new ResponseTransfer("JSON Content!"); }

Nell'esempio, abbiamo utilizzato la costante MediaType.APPLICATION_JSON_VALUE . In alternativa, possiamo usare direttamente application / json .

Successivamente, implementiamo un nuovo metodo, mappato allo stesso percorso / content , ma restituendo invece contenuto XML:

@PostMapping(value = "/content", produces = MediaType.APPLICATION_XML_VALUE) @ResponseBody public ResponseTransfer postResponseXmlContent( @RequestBody LoginForm loginForm) { return new ResponseTransfer("XML Content!"); }

Ora, a seconda del valore di un parametro Accept inviato nell'intestazione della richiesta, avremo risposte diverse.

Vediamolo in azione:

curl -i \ -H "Accept: application/json" \ -H "Content-Type:application/json" \ -X POST --data '{"username": "johnny", "password": "password"}' "//localhost:8080/.../content"

Il comando CURL restituisce una risposta JSON:

HTTP/1.1 200 Content-Type: application/json Transfer-Encoding: chunked Date: Thu, 20 Feb 2020 19:43:06 GMT {"text":"JSON Content!"}

Ora, cambiamo il parametro Accetta :

curl -i \ -H "Accept: application/xml" \ -H "Content-Type:application/json" \ -X POST --data '{"username": "johnny", "password": "password"}' "//localhost:8080/.../content"

Come anticipato, questa volta otteniamo un contenuto XML:

HTTP/1.1 200 Content-Type: application/xml Transfer-Encoding: chunked Date: Thu, 20 Feb 2020 19:43:19 GMT XML Content!

4. Conclusione

Abbiamo creato un semplice client Angular per l'app Spring che mostra come utilizzare le annotazioni @RequestBody e @ResponseBody .

Inoltre, abbiamo mostrato come impostare un tipo di contenuto quando si utilizza @ResponseBody .

Come sempre, gli esempi di codice sono disponibili su GitHub.