Anotasi RequestBody dan ResponseBody Spring

1. Perkenalan

Dalam tutorial singkat ini, kami memberikan ikhtisar singkat tentang anotasi Spring @RequestBody dan @ResponseBody .

2. @Requestody

Sederhananya, yang @RequestBody penjelasan memetakan HttpRequest tubuh untuk transfer atau objek domain, memungkinkan deserialization otomatis dari inbound HttpRequest tubuh ke objek Java.

Pertama, mari kita lihat metode pengontrol Pegas:

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

Spring secara otomatis melakukan deserialisasi JSON menjadi jenis Java, dengan asumsi jenis yang sesuai telah ditentukan.

Secara default, jenis yang kami anotasi dengan anotasi @RequestBody harus sesuai dengan JSON yang dikirim dari pengontrol sisi klien kami:

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

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

Mari kita 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 kita butuhkan untuk Spring REST API dan klien Angular menggunakan anotasi @ RequestBody .

3. @Respons

The @ResponseBody penjelasan memberitahu controller yang objek kembali secara otomatis serial ke JSON dan berlalu kembali ke HttpResponse objek.

Misalkan kita memiliki objek Respon khusus :

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

Selanjutnya, pengontrol terkait dapat diimplementasikan:

@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 pengembang browser kami atau menggunakan alat seperti Postman, kami dapat melihat respons berikut:

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

Ingat, kita tidak perlu menganotasi pengontrol beranotasi @ RestController- dengan anotasi @ResponseBody karena Spring melakukannya secara default.

3.1. Mengatur Jenis Konten

Saat kami menggunakan anotasi @ResponseBody , kami masih dapat menyetel secara eksplisit jenis konten yang dikembalikan metode kami.

Untuk itu, kita dapat menggunakan @RequestMapping 's menghasilkan atribut. Perhatikan bahwa anotasi seperti @PostMapping , @GetMapping , dll. Menentukan alias untuk parameter itu.

Sekarang mari tambahkan titik akhir baru yang mengirimkan respons JSON:

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

Dalam contoh, kami menggunakan konstanta MediaType.APPLICATION_JSON_VALUE . Alternatifnya, kita bisa menggunakan application / json secara langsung.

Selanjutnya, mari kita terapkan metode baru, yang dipetakan ke jalur / konten yang sama , tetapi mengembalikan konten XML:

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

Sekarang, tergantung pada nilai parameter Terima yang dikirim di header permintaan, kita akan mendapatkan tanggapan yang berbeda.

Mari kita lihat ini beraksi:

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 diantisipasi, kali ini kami mendapatkan konten XML:

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 membangun klien sudut sederhana untuk aplikasi semi yang menunjukkan bagaimana menggunakan @RequestBody dan @ResponseBody penjelasan.

Selain itu, kami menunjukkan cara menyetel tipe konten saat menggunakan @ResponseBody .

Seperti biasa, contoh kode tersedia di GitHub.