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.