Dapatkan dan Kirim Senarai Objek dengan RestTemplate

1. Pengenalan

The RestTemplate kelas adalah alat yang pusat untuk menjalankan operasi HTTP klien dalam Spring. Ini menyediakan beberapa kaedah utiliti untuk membina permintaan HTTP dan menangani respons.

Dan, kerana RestTemplate berintegrasi dengan Jackson, ia dapat membuat siri / deserialisasi kebanyakan objek ke dan dari JSON tanpa banyak usaha. Walau bagaimanapun, bekerja dengan koleksi objek tidak begitu mudah .

Dalam tutorial ini, kita akan melihat bagaimana untuk menggunakan RestTemplate untuk kedua-dua GET dan POST senarai objek.

2. Contoh Perkhidmatan

Kami akan menggunakan API pekerja yang mempunyai dua titik akhir HTTP - dapatkan semua dan buat:

  • GET / pekerja
  • POST / pekerja

Untuk komunikasi antara pelanggan dan pelayan, kami akan menggunakan DTO ringkas untuk merangkumi data asas pekerja:

public class Employee { public long id; public String title; // standard constructor and setters/getters }

Kami kini bersedia untuk menulis kod yang menggunakan RestTemplate untuk mendapatkan dan membuat senarai objek Karyawan .

3. Dapatkan Senarai Objek dengan RestTemplate

Biasanya semasa memanggil GET, anda boleh menggunakan salah satu kaedah yang dipermudahkan dalam RestTemplate , seperti :

getForObject (URI url, Jenis tindak balas kelas)

Ini menghantar permintaan ke URI yang ditentukan menggunakan kata kerja GET dan mengubah badan respons menjadi jenis Java yang diminta. Ini berfungsi dengan baik untuk kebanyakan kelas, tetapi mempunyai batasan: kami tidak dapat menghantar senarai objek.

Masalahnya disebabkan oleh penghapusan jenis dengan generik Java. Semasa aplikasi berjalan, ia tidak mengetahui jenis objek apa yang ada dalam senarai. Ini bererti data dalam senarai tidak dapat didesialisasikan ke dalam jenis yang sesuai.

Nasib baik kami mempunyai dua pilihan untuk menyelesaikannya.

3.1. Menggunakan Susun atur

Pertama, kita boleh menggunakan RestTemplate. getForEntity () untuk GET pelbagai objek melalui responseType parameter. Apa sahaja kelas yang kami tentukan akan sesuai dengan jenis parameter ResponseEntity :

ResponseEntity response = restTemplate.getForEntity( "//localhost:8080/employees/", Employee[].class); Employee[] employees = response.getBody();

Selanjutnya, kita dapat menggunakan RestTemplate.exchange untuk mencapai hasil yang sama.

Perhatikan bahawa kolaborator yang melakukan pengangkatan berat di sini adalah ResponseExtractor, jadi jika kami memerlukan penyesuaian lebih lanjut, kami dapat memanggil melaksanakan dan memberikan contoh kami sendiri.

3.2. Menggunakan Kelas Pembungkus

Beberapa API akan mengembalikan objek tingkat atas yang mengandungi senarai pekerja dan bukannya mengembalikan senarai secara langsung. Untuk menangani keadaan ini, kita boleh menggunakan kelas pembungkus yang mengandungi senarai pekerja.

public class EmployeeList { private List employees; public EmployeeList() { employees = new ArrayList(); } // standard constructor and getter/setter }

Sekarang kita boleh menggunakan kaedah getForObject () yang lebih mudah untuk mendapatkan senarai pekerja:

EmployeeList response = restTemplate.getForObject( "//localhost:8080/employees", EmployeeList.class); List employees = response.getEmployees();

Kod ini jauh lebih mudah tetapi memerlukan objek pembungkus tambahan.

4. Kirimkan Senarai Objek dengan RestTemplate

Sekarang mari kita lihat cara menghantar senarai objek dari pelanggan kami ke pelayan. Seperti di atas, RestTemplate menyediakan kaedah ringkas untuk memanggil POST:

postForObject (URI url, Permintaan objek, Jenis tindak balas kelas)

Ini akan menghantar HTTP POST ke URI yang diberikan, dengan badan permintaan pilihan, dan menukar tindak balas menjadi jenis yang ditentukan. Tidak seperti senario GET di atas, kita tidak perlu risau tentang penghapusan jenis .

Ini kerana sekarang kita pergi dari objek Java ke JSON. Senarai objek dan jenisnya diketahui oleh JVM, dan oleh itu disenaraikan dengan betul:

List newEmployees = new ArrayList(); newEmployees.add(new Employee(3, "Intern")); newEmployees.add(new Employee(4, "CEO")); restTemplate.postForObject( "//localhost:8080/employees/", newEmployees, ResponseEntity.class);

4.1. Menggunakan Kelas Pembungkus

Sekiranya kita perlu menggunakan kelas pembungkus agar sesuai dengan senario GET di atas, itu juga mudah. Kami boleh menghantar senarai baru menggunakan RestTemplate :

List newEmployees = new ArrayList(); newEmployees.add(new Employee(3, "Intern")); newEmployees.add(new Employee(4, "CEO")); restTemplate.postForObject( "//localhost:8080/employees", new EmployeeList(newEmployees), ResponseEntity.class);

5. Kesimpulan

Menggunakan RestTemplate adalah cara mudah untuk membina klien HTTP untuk berkomunikasi dengan perkhidmatan anda.

Ini menyediakan sebilangan kaedah untuk bekerja dengan setiap kaedah HTTP dan objek sederhana. Dengan sedikit kod tambahan, kita dapat menggunakannya dengan mudah untuk bekerja dengan senarai objek.

Seperti biasa, kod lengkap terdapat dalam projek Github.