Artikel ini memperkenalkan penggunaan klien Jersey untuk meminta layanan Spring Boot (RESTful), dan membagikannya kepada Anda, sebagai berikut:
Klien Jersey mendapatkan enkapsulasi instance objek klien:
@Service ("JerseypoolingClient") Kelas Publik JerseypoolingClientFactoryBean mengimplementasikan FactoryBean <Factore>, InitializeBean, DisposableBean { /*** Antarmuka klien adalah antarmuka dasar dari klien REST dan digunakan untuk berkomunikasi dengan server sisanya. Klien didefinisikan sebagai objek kelas berat yang mengelola berbagai objek di bagian bawah komunikasi klien, seperti konektor, parser, dll. Oleh karena itu, tidak disarankan untuk menghasilkan sejumlah besar instance klien dalam aplikasi. Ini diperlukan dalam pengembangan. Selain itu, antarmuka ini mensyaratkan bahwa instance harus ditutup, jika tidak maka akan menyebabkan kebocoran memori*/ klien klien pribadi; / ** * Jumlah maksimum koneksi untuk klien, default adalah 2000 */ private int maxtotal = 2000; / *** Jumlah maksimum default koneksi per rute*/ private int defaultMaxperroute = 1000; ClientConfig Private ClientConfig; publik jerseypoolingclientfactorybean () {} / *** konstruktor dengan konfigurasi* @param clientConfig* / public jerseypoolingclientfactorybean (clientConfig clientConfig) {this.clientConfig = clientConfig; } public jerseypoolingclientfactorybean (int maxtotal, int defaultMaxperroute) {this.maxtotal = maxtotal; this.defaultMaxperroute = defaultMaxperroute; } / ** * Perhatian: * Detail: Lepaskan sumber daya klien saat wadah dihancurkan * @author chhliu * / @override public void destroy () melempar Exception {this.client.close (); } / ** * * Perhatian: * Rincian: Inisialisasi objek klien dalam bentuk kumpulan koneksi * @author chhliu * / @override public void afterpropertiesset () melempar pengecualian {// jika konstruktor dengan klien tidak digunakan, instance {nulkon, dan konfigurasi client clients. ClientConfig (); // CONFERSITAS CONNECTION Pool Management, kelas ini aman-utas dan mendukung beberapa operasi bersamaan PoolingHttpClientConnectionManager PCM = PoolingHttpClientConnectionManager () baru; pcm.setMaxtotal (this.maxtotal); pcm.setDefaultMaxPerroute (this.defaultMaxperroute); clientConfig.property (ApacheclientProperties.Connection_Manager, PCM); / * * Saat menggunakan Jersey untuk meminta Layanan Boot Spring, Spring Boot menggunakan Jackson untuk mengurai JSON secara default *, sementara Jersey menggunakan Moxy untuk mengurai JSON secara default. Ketika Jersey Client menginginkan layanan boot musim semi untuk meminta sumber daya,* Perbedaan ini akan menyebabkan server dan klien untuk mengonversi POJO secara berbeda, menghasilkan kesalahan deserialisasi* Oleh karena itu, Anda perlu mendaftarkan fitur Jackson dalam instance konfigurasi klien di sini*/ client config.register (jacksonfeature.class); // Gunakan konektor Apache konfigurasi, konektor default adalah httpurlConnector clientConfig.connectorProvider (ApacheconnectorProvider baru ()); Client = ClientBuilder.NewClient (ClientConfig); } else {// Gunakan ClientConfig di konstruktor untuk menginisialisasi objek klien klien = clientBuilder.newClient (this.clientConfig); }} /** * Perhatian: * Detail: Mengembalikan objek klien. Jika objeknya nol, buat klien default * @author chhliu */ @override klien publik getObject () melempar pengecualian {if (null == this.client) {return clientBuilder.newClient (); } return this.client; } / ** * Perhatian: * Detail: Dapatkan jenis objek klien * @Author chhliu * / @Override Public Class <?> getObjectType () {return (this.client == null? Client.class: this.client.getClass ()); } / ** * Perhatian: * Detail: Apakah objek klien adalah singleton, default ke singleton * @author chhliu * / @Override public boolean issingleton () {return true; }}Meminta enkapsulasi layanan boot musim semi:
@Component ("JerseyClient") kelas publik JerseyClient {@resource (name = "JerseypoolingClient") Klien Private Client; / ** * Perhatian: * Rincian: Permintaan objek melalui id * @author chhliu */ hasil publik mg <githubentity> getResponsyId (ID string akhir) melempar JSONPROCESSINGEXCEPTION, IOEXECCETION {WebTarget WebTarget = client.target ("http: // localhost: 8080") .path ("/github/get/user/"+id); Invocation.Builder InvocationBuilder = WebTarget.Request (Mediatype.Application_json); Generictype <resultMSG <GithUbentity>> Generictype = Generictype baru <resultMSg <Githubentity>> () {}; Respons respons = invocationBuilder.get (); if (response.getStatus () == 200) { /** Ketika metode readentity dipanggil, program akan secara otomatis melepaskan koneksi* bahkan jika metode readentity tidak dipanggil dan objek tipe generik dikembalikan secara langsung, lapisan yang mendasarinya masih akan melepaskan koneksi* / return response.readentity (generictype); } else {resultMsg <Githubentity> res = new resultMSg <Githubentity> (); res.setErrorCode (String.ValueOf (response.getStatus ())); res.seterrormsg (response.getstatusinfo (). tostring ()); res.setok (false); Return Res; }} / ** * Perhatian: * Rincian: Pagination Query * @Author chhliu * / Public HasilMSg <pager <githubentity>> getGithubWithPager (final integer pageOffset, final integer pageSize, final string orderColumn) {WebTarget WebTarget = client.target ("http: // localhost: 8080") .path ("/github/get/user/page") .queryparam ("pageoffset", pageoffset) .queryparam ("pageSize", pageSize) .queryparam ("ordercolumn", ordercolumn); // Perhatikan bahwa jika jenis media di sini adalah mediatype.application_json, maka parameter yang sesuai dalam layanan harus didahului oleh @RequestBody Invocation.builder InvocationBuilder = WebTarget.Request (MediaType.application_json); Generictype <resultMSG <pager <Githubentity>>>> generictype = Generictype baru <resultMsg <pager <githubentity>>> () {}; Respons respons = invocationBuilder.get (); if (response.getStatus () == 200) {return response.readentity (generictype); } else {resultMSg <pager <githubentity>> res = new resultmsg <pager <githubentity>> (); res.setErrorCode (String.ValueOf (response.getStatus ())); res.seterrormsg (response.getstatusinfo (). tostring ()); res.setok (false); Return Res; }} / ** * Perhatian: * Rincian: Kueri Berdasarkan Nama Pengguna * @Author Chhliu * / Hasil PublicMSg <Daftar <Githubentity>> GetResponsebyUserName (WebTarget String Final String), IoException {WebTarget WebTarget = client.target ("http: // localhost: 8080") .path ("/github/get/user/"+nama pengguna); Invocation.Builder InvocationBuilder = WebTarget.Request (Mediatype.Application_json); Generictype <resultMSG <Daftar <Githubentity>>> Generictype = Generictype baru <resultMsg <Daftar <Githubentity>>> () {}; Respons respons = invocationBuilder.get (); if (response.getStatus () == 200) {return response.readentity (generictype); } else {resultMsg <list <githubentity>>> res = new resultmsg <list <githubentity>> (); res.setErrorCode (String.ValueOf (response.getStatus ())); res.seterrormsg (response.getstatusinfo (). tostring ()); res.setok (false); Return Res; }}/** * Perhatian: * Rincian: Hapus catatan berdasarkan id * @author chhliu */hasil publikmsg <githubentity> deletebyid (ID string akhir) melempar jsonProcessingException, ioException {WebTarget = client.target ("http: // localhostete) (808 (208 (" httphy. Generictype <resultMSG <GithUbentity>> Generictype = Generictype baru <resultMSg <Githubentity>> () {}; Respons respons = target.request (). Delete (); if (response.getStatus () == 200) {return response.readentity (generictype); } else {resultMsg <Githubentity> res = new resultMSg <Githubentity> (); res.setErrorCode (String.ValueOf (response.getStatus ())); res.seterrormsg (response.getstatusinfo (). tostring ()); res.setok (false); Return Res; }}/** * Perhatian: * Detail: Perbarui catatan * @author chhliu */hasil publikmsg <githubentity> update (entitas gitubentitas akhir) melempar jsonprocessingException, ioException {WebTetget = client.target ("http: // localhost {808) (" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" githUnpath ("localsception, ioException {localsception {local" "" " Generictype <resultMSG <GithUbentity>> Generictype = Generictype baru <resultMSg <Githubentity>> () {}; Respons respons = target.Request (). Buildput (entitas.entity (entitas, mediatype.application_json)). Invoke (); if (response.getStatus () == 200) {return response.readentity (generictype); } else {resultMsg <Githubentity> res = new resultMSg <Githubentity> (); res.setErrorCode (String.ValueOf (response.getStatus ())); res.seterrormsg (response.getstatusinfo (). tostring ()); res.setok (false); Return Res; }}/** * Perhatian: * Rincian: Masukkan catatan * @author chhliu */hasil publiksmsg <githubentity> save (entitas gitubentitas akhir) melempar jsonprocessingException, ioException {Webtarget target = client.target ("http: // localhost {808) (" "" "" "" "" "" "" "" "" "" "" "" "" "github/client.target (" http: {local ("github." Generictype <resultMSG <GithUbentity>> Generictype = Generictype baru <resultMSg <Githubentity>> () {}; Respons respons = target.Request (). BuildPost (Entity.Entity (Entity, Mediatype.Application_json)). Invoke (); if (response.getStatus () == 200) {return response.readentity (generictype); } else {resultMsg <Githubentity> res = new resultMSg <Githubentity> (); res.setErrorCode (String.ValueOf (response.getStatus ())); res.seterrormsg (response.getstatusinfo (). tostring ()); res.setok (false); Return Res; }}} Penjelasan Detail Antarmuka Klien Jersey
1 antarmuka klien
Membuat instance klien dibangun melalui ClientBuilder. Biasanya instance ClientConfig digunakan sebagai parameter. Jika kami menggunakan Client Client = ClientBuilder.NewClient () untuk membuat instance klien, kami akan membuat instance klien setiap kali, tetapi contohnya adalah objek kelas berat. Oleh karena itu, disarankan untuk menggunakan pengumpulan koneksi HTTP untuk mengelola koneksi, daripada membuat objek klien setiap kali kami meminta. Untuk metode manajemen kumpulan koneksi tertentu, lihat contoh kode di atas.
2 Antarmuka WebTarget
Antarmuka WebTarget adalah antarmuka yang mengimplementasikan penentuan posisi sumber daya untuk klien REST. Melalui antarmuka WebTarget, kita dapat menentukan alamat spesifik dari sumber daya yang diminta, parameter kueri dan informasi jenis media, dll. Kita dapat menyelesaikan konfigurasi instance WebTarget melalui rantai metode, tetapi harus dicatat bahwa meskipun metode penggunaan webtarget sangat mirip dengan rantai metode StringBuffer, itu pada dasarnya berbeda. Rantai metode webtarget harus mengatur nilai pengembalian metode sebagai pegangan ke proses selanjutnya. Apa artinya ini? Lihat contoh -contoh berikut:
Contoh 1: Contoh Rantai Metode StringBuffer
StringBuffer SB = StringBuffer baru ("LCH"); SB.Append ("Hello"); SB.Append ("Dunia"); SB.Append ("Hello"). Append ("World"); // Metode ini sama dengan dua baris kode di atas.Contoh 2: Contoh Rantai Metode WebTarget
// Gunakan rantai metode kode satu baris untuk membuat webTarget webTarget webTarget = client.target ("http: // localhost: 8080"); webtarget.path ("/github/get/user/page") .queryparam ("pageoffset", pageOffset) .queryparam ("pageSize", pageSize) .queryparam ("orderColumn", orderColumn); // Berikut adalah penggunaan rantai metode untuk membuat instantiate webtarget webtarget.path ("/github/get/user/halaman"); WebTarget.QueryParam ("PageOffset", PageOffset); webtarget.queryparam ("halaman", halaman); // Hasil dari dua metode instantiasi di atas sangat berbeda. Metode instantiasi di atas OK, tidak ada masalah, tetapi metode instantiasi berikut memiliki masalah. Dalam metode instantiasi berikut, setiap baris akan menghasilkan // objek webTarget baru. Target asli tidak memainkan peran apa pun. Bagaimanapun, contoh dari setiap baris berbeda. Jika kita ingin instantiate dalam beberapa baris, kita harus memberikan pegangan untuk pengembalian setiap metode. Metode ini adalah sebagai berikut: WebTarget target = client.target ("http: // localhost: 8080"); WebTarget PathTarget = target.path ("/github/get/user/page"); WebTarget paramTarget = PathTarget.QueryParam ("PageOffset", PageOffset); // Saat menggunakannya terakhir, gunakan objek instance WebTarget terakhir 3 Antarmuka Doa
Antarmuka doa adalah antarmuka yang memulai permintaan ke server REST setelah menyelesaikan konfigurasi penentuan posisi sumber daya. Permintaan tersebut mencakup dua metode: sinkronisasi dan asinkron. Ini didefinisikan oleh antarmuka pembangun di dalam antarmuka doa. Antarmuka pembangun mewarisi interface sinkronisasi syncinvoker. Contoh panggilan asinkron adalah sebagai berikut:
Future <resultMSG <Daftar <Githubentity>>> Respons = InvocationBuilder.async (). Get (Generictype); if (response.isdone ()) {return response.get (); } Instance Invocation.Builder Antarmuka mengeksekusi permintaan GET dan POST untuk mengirimkan kueri dan membuat masing -masing. Secara default, tipe pengembalian panggilan metode HTTP adalah tipe respons, dan juga mendukung nilai pengembalian jenis generik. Dalam contoh di atas, kami menggunakan sejumlah besar obat generik, jadi kami tidak akan menjelaskan terlalu banyak di sini.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.