RequestBody dan ResponseBody Anotasi Spring

1. Pengenalan

Dalam tutorial ringkas ini, kami memberikan gambaran ringkas mengenai anotasi Spring @RequestBody dan @ResponseBody .

2. @RequestBody

Ringkasnya, yang @RequestBody anotasi memetakan HttpRequest badan dengan pemindahan atau objek domain, membolehkan deserialization automatik daripada inbound HttpRequest badan ke objek Java.

Pertama, mari kita lihat kaedah pengawal Spring:

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

Spring secara automatik mendeseralisasikan JSON menjadi jenis Java, dengan anggapan yang sesuai ditentukan.

Secara lalai, jenis yang kami beri penjelasan dengan anotasi @RequestBody mesti sesuai dengan JSON yang dihantar dari pengawal sisi pelanggan kami:

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

Di sini, objek yang kami gunakan untuk mewakili peta badan HttpRequest ke objek LoginForm kami .

Mari uji ini menggunakan CURL:

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

Ini semua yang kami perlukan untuk Spring REST API dan klien Angular menggunakan anotasi @ RequestBody .

3. @ResponseBody

The @ResponseBody anotasi memberitahu pengawal bahawa objek yang dikembalikan secara automatik bersiri ke dalam JSON dan dihantar kembali ke dalam HttpResponse objek.

Katakan kita mempunyai objek Respons tersuai :

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

Seterusnya, pengawal yang berkaitan dapat dilaksanakan:

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

Di konsol pembangun penyemak imbas kami atau menggunakan alat seperti Postman, kita dapat melihat respons berikut:

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

Ingat, kami tidak perlu memberi penjelasan kepada pengawal yang diberi anotasi @ RestController dengan anotasi @ResponseBody kerana Spring melakukannya secara lalai.

3.1. Menetapkan Jenis Kandungan

Apabila kami menggunakan anotasi @ResponseBody , kami masih dapat menetapkan jenis kandungan secara eksplisit yang dikembalikan oleh kaedah kami.

Untuk itu, kita boleh menggunakan atribut @RequestMapping 's menghasilkan . Perhatikan bahawa anotasi seperti @PostMapping , @GetMapping , dll menentukan alias untuk parameter tersebut.

Mari sekarang tambahkan titik akhir baru yang menghantar respons JSON:

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

Dalam contoh tersebut, kami menggunakan pemalar MediaType.APPLICATION_JSON_VALUE . Sebagai alternatif, kita boleh menggunakan aplikasi / json secara langsung.

Seterusnya, mari kita laksanakan kaedah baru, dipetakan ke jalur / kandungan yang sama , tetapi mengembalikan kandungan XML sebagai gantinya:

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

Sekarang, bergantung pada nilai parameter Terima yang dihantar di tajuk permintaan, kami akan mendapat respons yang berbeza.

Mari lihat ini dalam tindakan:

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

Perintah CURL mengembalikan respons JSON:

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

Sekarang, mari kita ubah parameter Terima :

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

Seperti yang dijangkakan, kami mendapat kandungan XML kali ini:

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

4. Kesimpulan

Kami telah membina pelanggan sudut mudah untuk aplikasi Spring yang menunjukkan bagaimana untuk menggunakan @RequestBody dan @ResponseBody penjelasan.

Selain itu, kami menunjukkan cara menetapkan jenis kandungan ketika menggunakan @ResponseBody .

Seperti biasa, sampel kod boleh didapati di GitHub.