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.