Artikel hari ini akan membahas pertanyaan dasar tentang REST di Musim Semi. Ini akan sangat berguna bagi programmer pemula.
Panduan resmi dari Pivotal, yang mengatakan tentang topik untuk persiapan.

Spring REST adalah bagian dari Spring MVC. Oleh karena itu, sebagian besar Spring MVC akan digunakan dalam REST dan sebaliknya. Untuk tampilan yang lebih mendalam di Spring MVC, baca artikel ini .
Untuk apa REST dibuat?Untuk memahami konsep REST, Anda perlu mengurai akronim ke dalam komponen-komponennya:
- Representasi - sumber daya dalam REST dapat direpresentasikan dalam bentuk apa pun - JSON, XML, teks, atau bahkan HTML - tergantung pada data mana yang lebih cocok untuk konsumen
- Negara - saat bekerja dengan REST, Anda harus fokus pada kondisi sumber daya, dan bukan pada tindakan dengan sumber daya
- Transfer - REST mencakup transfer data sumber daya, dalam bentuk apa pun yang disajikan, dari satu aplikasi ke aplikasi lainnya.
REST adalah transfer status sumber daya antara server dan klien.
Apa itu sumber daya?Sumber daya di REST adalah semua yang dapat ditransfer antara klien dan server.
Berikut adalah beberapa contoh sumber daya:
- Berita
- Suhu di St. Petersburg pada hari Senin pukul 4 pagi
- Gaji karyawan
- Pemilihan basis data
- Hasil pencarian
Apa kepanjangan dari CRUD?Tindakan dalam REST ditentukan oleh metode http.
Get
, Post
, Put
, Delete
, Patch
, dan lainnya.
Yang paling umum digunakan dilambangkan dengan akronim CRUD:
- Buat -
POST
- Baca -
GET
- Perbarui -
PUT
- Hapus -
DELETE
Apakah REST aman? Bagaimana Anda bisa melindunginya?Secara default, REST tidak aman.
Anda dapat mengkonfigurasi keamanan dengan Basic Auth, JWT, OAuth2
.
Apa itu operasi simpan?Ini adalah operasi yang tidak mengubah sumber daya. Berikut daftar mereka:
Apa operasi idempoten? Mengapa idempotensi penting?Metode idempoten adalah metode dengan setiap doa yang hasilnya akan sama.
Artinya, hasil setelah 1 panggilan metode seperti itu akan sama dengan hasil setelah 10 panggilan metode ini.
Ini penting untuk API toleran kesalahan. Misalkan klien ingin memperbarui sumber daya menggunakan permintaan POST? Jika POST bukan metode idempoten, maka beberapa panggilan akan menyebabkan pembaruan sumber daya yang tidak terduga. Menggunakan metode idempoten, Anda melindungi diri dari banyak kesalahan.
Apakah skala REST baik?Ya SISA skala dengan baik karena tidak menyimpan negara.
Ini berarti bahwa ia tidak menyimpan informasi sesi pengguna di server.
Informasi klien tidak boleh disimpan di sisi server, tetapi harus dikirimkan setiap kali ke tempat itu diperlukan. Inilah yang dimaksud ST dalam REST, Transfer Negara. Anda lulus negara, bukan menyimpannya di server.
REST juga dapat dioperasikan - ini berarti bahwa berbagai program yang ditulis dalam bahasa yang berbeda dapat berinteraksi dengannya. Ini berasal dari 2 faktor:
- Klien HTTP yang dapat dioperasikan. Klien yang berbeda harus mengirim permintaan http yang sama.
- Interoperabilitas di tingkat jenis media. Klien yang berbeda harus mengirim dan menerima sumber daya yang sama dengan benar.
Apa itu HttpMessageConverter?HttpMessageConverter
mengubah permintaan menjadi objek dan sebaliknya.
Spring memiliki beberapa implementasi antarmuka ini, dan Anda dapat membuatnya sendiri.
Dalam hal ini, DispatcherServlet
tidak menggunakan Model dan Tampilan.
Di REST, Model dan View tidak ada sama sekali. Hanya ada data yang diberikan oleh pengontrol dan representasi sumber ketika pesan dikonversi dari jenis media (json, xml ...) menjadi objek.
Daftar Konverter:
BufferedImageHttpMessageConverter
- Mengubah BufferedImage
ke (dari) kode gambar.
Jaxb2RootElementHttpMessageConverter
- mengkonversi xml ke (dari) objek yang ditandai dengan penjelasan jaxb2. Daftar jika jaxb2 ada di classpath.
MappingJackson2HttpMessageConverter
- mengubah JSON menjadi (dari) objek. Daftar jika Jackson 2 ada di classpath.
StringHttpMessageConverter
- mengonversi semua file media menjadi teks / polos.
Bagaimana cara kerja anotasi @RestController?@RestController
ditempatkan pada kelas pengontrol alih-alih @Controller
. Dia menunjukkan bahwa kelas ini tidak beroperasi pada model, tetapi pada data. Terdiri dari @RequestBody
dan @RequestBody
.
@Controller @ResponseBody public interface RestController
Mengapa @ResponseBody?@ResponseBody
diletakkan pada metode yang bekerja dengan data, bukan model. Tidak perlu ditentukan secara eksplisit jika @RestController
digunakan.
Metode reguler mengembalikan Model
, dan metode @ResponseBody
beranotasi mengembalikan objek yang dikonversi ke file media menggunakan HttpMessageConverter
.
Apa yang dilakukan oleh anotasi @RequestMapping?Anotasi ini digunakan untuk memetakan permintaan ke kelas dan metode pengontrol.
Sebelumnya, ini digunakan untuk metode kelas untuk menunjukkan URI, metode http, jenis data yang dikirim, dll. Dalam versi Spring yang lebih baru, itu diganti dengan @GetMapping
, @PostMapping
, dll.
Sekarang hanya digunakan untuk menunjukkan URI ke kelas controller.
Apa itu anotasi @GetMapping, @PostMapping, @DeleteMapping, dan lainnya?Ini adalah penjelasan yang lebih sempit untuk memetakan metode http.
@GetMapping
- Menangani mendapat permintaan@PostMapping
- Menangani permintaan posting@DeleteMapping
- Menangani permintaan penghapusan@PutMapping
- Menangani permintaan@PatchMapping
- Menangani permintaan tambalan
Semua yang tertulis di bawah ini juga merupakan karakteristik dari anotasi lainnya.
Annotation @GetMapping hanyalah anotasi yang berisi @RequestMapping (metode = RequestMethod.GET) .
Ini juga memungkinkan Anda menyempurnakan metode penangan.
Parameternya (parameter tersebut dikonversi ke parameter @RequestMapping yang serupa):
path
- URIheaders
- headername
- nama penanganparams
- parameterproduces
- jenis data yang dikembalikan (JSON, XML, teks). Digunakan di RESTconsumes
- jenis data yang diterima. Digunakan di REST
Secara default, anotasi mengambil jalur ke metode.
@GetMapping("managers") = @GetMapping(path = "managers")
Mengapa menggunakan anotasi @RequestParam?Anotasi ini digunakan agar metode handler bisa mendapatkan parameter dari permintaan http.
Permintaan dengan parameter: http://localhost:8080/getByName/name=Ivan
.
Kode berikut akan meletakkan string Ivan
dalam name
variabel.
@GetMapping("getByName") public User getUserByName(@RequestParam("name") String name) {
Mengapa menggunakan anotasi @PathVariable?Anotasi ini mendapat bagian khusus dari URI.
URI: http://localhost:8080/getById/23
Kode berikut akan menempatkan 23
dalam variabel id
.
@GetMapping("getById/{id}") public User getUserById(@PathVariable("id") String id) {
Apa arti berbagai kode untuk respons http?DAPATKAN - 200 OK
POST - 200 OK, 201 Dibuat, 204 Tidak Ada Konten
PUT - 200 OK, 201 Dibuat, 204 Tidak Ada Konten
HAPUS - 204 Tidak Ada Konten, 202 Diterima
Mengapa saya memerlukan anotasi @ResponseStatus?Ini memungkinkan Anda untuk mengatur kode respons. Biasanya, Spring itu sendiri menetapkan kode respons yang diinginkan, tetapi ada kalanya Anda perlu menimpanya.
@PostMapping @ResponseStatus(HttpStatus.CREATED) public void add(...) {...}
Alih-alih menggunakan anotasi, Anda dapat mengembalikan ResponseEntity
dan secara manual mengatur kode respons.
Menggunakan ResponseEntity
dan @ReponseStatus
bersamaan tidak disarankan.
Apa itu ResponseEntity?Ini adalah kelas khusus yang mewakili respons http. Berisi tubuh respons, kode status, tajuk. Kita dapat menggunakannya untuk menyempurnakan respon http.
Ini adalah tipe universal, dan objek apa pun dapat digunakan sebagai tubuh:
@GetMapping("/hello") ResponseEntity hello() { return new ResponseEntity("Hello World!", HttpStatus.OK); }
Mengapa @RequestBody?Anda dapat menggunakan anotasi @RequestBody
pada parameter metode sehingga badan permintaan dikonversi ke parameter ini.
@PostMapping("accounts")
Anda dapat menggunakan @Validated
bersama dengan @RequestBody
untuk memeriksa permintaan.
Apa itu RestTemplate? Apa kelebihannya?RestTemplate adalah klien khusus di Spring untuk mengirim permintaan http. Ini menyediakan API yang nyaman untuk memanggil titik akhir REST dengan mudah pada satu baris.
RestTemplate restTemplate = new RestTemplate(); String fooResourceUrl = "http://localhost:8080/spring-rest/foos"; ResponseEntity response = restTemplate.getForEntity(fooResourceUrl + "/1", String.class);
Anda dapat mempelajari lebih lanjut tentang penggunaan dalam artikel ini .