تقدم هذه المقالة استخدام عميل Jersey لطلب خدمة SPRING BOOT (RESTFLE) ، ومشاركتها معك ، على النحو التالي:
Jersey Client يحصل على تغليف مثيل كائن العميل:
Service ("jerseypoolingclient") الطبقة العامة jerseypoolingclientfactorybean تنفذ Factorybean <slient> ، initializingBean ، DiscipableBean { /*** واجهة العميل هي الواجهة الأساسية لعميل REST وتستخدم للتواصل مع خادم REST. يتم تعريف العميل على أنه كائن للوزن الثقيل الذي يدير الكائنات المختلفة في أسفل اتصال العميل ، مثل الموصلات ، المحللون ، وما إلى ذلك ، لذلك ، لا ينصح بإنشاء عدد كبير من مثيلات العميل في التطبيق. هذا ضروري في التنمية. بالإضافة إلى ذلك ، تتطلب هذه الواجهة إغلاق المثيل ، وإلا فإنه سيؤدي إلى تسرب الذاكرة*/ عميل العميل الخاص ؛ / ** * الحد الأقصى لعدد الاتصالات للعميل ، الافتراضي هو 2000 */ private int maxtotal = 2000 ؛ / *** الحد الأقصى للعدد الافتراضي للاتصالات لكل مسار*/ خاص int defaultMaxperRoute = 1000 ؛ ClientConfig الخاص ClientConfig ؛ public jerseypoolingclientfactorybean () {} / *** مُنشئ مع التكوين* param clientConfig* / public jerseypoolingclientfactorybean (clientConfig clientConfig) {this.clientConfig = clientConfig ؛ } public jerseypoolingclientfactorybean (int maxtotal ، int defaultMaxperRoute) {this.maxtotal = maxtotal ؛ this.defaultMaxPerRoute = defaultMaxPerRoute ؛ } / ** * الانتباه: * التفاصيل: إصدار موارد العميل عند تدمير الحاوية * Author Chhliu * / Override Public Void Dorting () يلقي الاستثناء {this.client.close () ؛ } / ** * * الانتباه: * التفاصيل: تهيئة كائن العميل في شكل تجمع اتصال * Author Chhliu * / Override public void بعد propertiesset () يلقي استثناء {// إذا لم يتم استخدام المُنشئ مع العميل == nelientconfig ، فإن مثيل الفئة هو null ، ويتم تكوين الافتراضي إذا تم تصنيعه (this.clientconfig) ClientConfig () ؛ // مثيل لإدارة تجمعات الاتصال ، فإن هذه الفئة آمنة لخيط مؤشرات الترابط وتدعم العديد من العمليات المتزامنة poolinghttpclientConnectionManager PCM = New PoolingHttpClientConnectionManager () ؛ pcm.setMaxTotal (this.maxtotal) ؛ pcm.setDefaultMaxperRoute (this.defaultMaxperRoute) ؛ ClientConfig.Property (ApacheClientProperties.connection_manager ، PCM) ؛ / * * عند استخدام Jersey لطلب خدمة Boot Service Spring ، يستخدم Spring Boot Jackson لتحرير JSON افتراضيًا * ، بينما يستخدم Jersey moxy لتحليل JSON بشكل افتراضي. عندما يريد عميل Jersey خدمة SPRING BOOT لطلب الموارد ،* سيؤدي هذا الاختلاف إلى تحويل الخادم والعميل بشكل مختلف ، مما يؤدي إلى أخطاء التخلص من التخلص* لذلك ، تحتاج إلى تسجيل ميزة Jackson في مثيل تكوين العميل هنا*/ clientConfig.register (jacksonfeature.class) ؛ // استخدم موصل Apache التكوين ، الموصل الافتراضي هو httpurlConnector clientConfig.connectorProvider (ApacheConnectorProvider () جديد) ؛ client = clientbuilder.newclient (clientConfig) ؛ } آخر {// استخدم ClientConfig في المُنشئ لتهيئة عميل كائن العميل = clientBuilder.newclient (this.clientConfig) ؛ }} /** * الانتباه: * التفاصيل: إرجاع كائن العميل. إذا كان الكائن فارغًا ، فقم بإنشاء عميل افتراضي * Auuthor Chhliu */ Override Public Client GetObject () يلقي الاستثناء {if (null == this.client) {return clientbuilder.newclient () ؛ } إرجاع هذا. } / ** * الانتباه: * التفاصيل: احصل على نوع كائن العميل * Auuthor chhliu * / Override public class <؟> getObjectType () {return (this.client == null؟ client.class: this.client.getClass ()) ؛ } / ** * الانتباه: * التفاصيل: ما إذا كان كائن العميل هو singleton ، افتراضيًا لـ Singleton * Author Chhliu * / Override Public Boolean Issingleton () {return true ؛ }}طلب تغليف خدمة التمهيد الربيع:
component ("jerseyclient") الفئة العامة jerseyclient {resource (name = "jerseypoolingclient") عميل خاص ؛ /** * الانتباه: * التفاصيل: الاستعلام عن الكائن من خلال معرف * Author Chhliu */public productsg <Githubentity> getResponsebonyB (معرف السلسلة النهائية) يلقي jsonprocessingexception ، ioException {webTarget WebTarget = client.Target ("http: // localhost: 8080"). invocation.builder invocationBuilder = webtarget.request (mediaType.application_json) ؛ generictype <prodepmsg <githubentity >> generictype = new GenericType <resultmsg <githubentity> () {} ؛ استجابة الاستجابة = InvocationBuilder.get () ؛ إذا كان (reponse.getStatus () == 200) { /*** عند استدعاء طريقة القراءة ، سيقوم البرنامج تلقائيًا بإصدار الاتصال* حتى لو لم يتم استدعاء طريقة القراءة ويتم إرجاع كائن النوع العام مباشرةً ، فستظل الطبقة الأساسية تحرر الاتصال* / response. } else {prodepmsg <GitHubentity> res = new prodemmsg <githubentity> () ؛ Res.SeterRorCode (string.valueof (response.getStatus ())) ؛ res.seterrormsg (response.getStatusinfo (). toString ()) ؛ Res.Setok (false) ؛ عودة الدقة ؛ } ستر client.target ("http: // localhost: 8080") .path ("/github/get/user/page") .queryparam ("pageoffset" ، pageoffset) .queryparam ("pagesize" ، pagesize). // لاحظ أنه إذا كان نوع الوسائط هنا هو mediaType.application_json ، فيجب أن تسبق المعلمة المقابلة في الخدمة @requestbody generictype <prodepmsg <pager <githubentity >>>> generictype = new generictype <prodepmsg <pager <githubentity>>> () {} ؛ استجابة الاستجابة = InvocationBuilder.get () ؛ if (response.getStatus () == 200) {return response.Readentity (generictype) ؛ } آخر {prodepmsg <pager <githubentity >> res = new prodemmsg <pager <githubentity >> () ؛ Res.SeterRorCode (string.valueof (response.getStatus ())) ؛ res.seterrormsg (response.getStatusinfo (). toString ()) ؛ Res.Setok (false) ؛ عودة الدقة ؛ } ستر client.target ("http: // localhost: 8080") .path ("/github/get/user/"+username) ؛ invocation.builder invocationBuilder = webtarget.request (mediaType.application_json) ؛ generictype <resultmsg <list <githubentity >>> generictype = new GenericType <resultmsg <list <githubentity>>> () {} ؛ استجابة الاستجابة = InvocationBuilder.get () ؛ if (response.getStatus () == 200) {return response.Readentity (generictype) ؛ } else {prodepmsg <list <githubentity >>> res = new prodemmsg <list <githubentity >> () ؛ Res.SeterRorCode (string.valueof (response.getStatus ())) ؛ res.seterrormsg (response.getStatusinfo (). toString ()) ؛ Res.Setok (false) ؛ عودة الدقة ؛ }}/** * الانتباه: * التفاصيل: حذف سجل يعتمد على المعرف * Author chhliu */public productsg <Githubentity> deleteeById (معرف السلسلة النهائية) يلقي jsonpressingexcepticexception ، ioException {webTarget = client.target ("http: // localhost: 8080"). generictype <prodepmsg <githubentity >> generictype = new GenericType <resultmsg <githubentity> () {} ؛ استجابة الاستجابة = target.request (). delete () ؛ if (response.getStatus () == 200) {return response.Readentity (generictype) ؛ } else {prodepmsg <GitHubentity> res = new prodemmsg <githubentity> () ؛ Res.SeterRorCode (string.valueof (response.getStatus ())) ؛ res.seterrormsg (response.getStatusinfo (). toString ()) ؛ Res.Setok (false) ؛ عودة الدقة ؛ }}/** * الانتباه: * التفاصيل: تحديث سجل * Auuthor Chhliu */public productsg <Githubentity> تحديث (كيان githubentity النهائي) يلقي jsonprocessingexception ، ioException {webTarget target = client.target ("http: // localhost: 8080"). generictype <prodepmsg <githubentity >> generictype = new GenericType <resultmsg <githubentity> () {} ؛ استجابة الاستجابة = target.request (). buildput (intity.entity (الكيان ، mediaType.application_json)). Invoke () ؛ if (response.getStatus () == 200) {return response.Readentity (generictype) ؛ } else {prodepmsg <GitHubentity> res = new prodemmsg <githubentity> () ؛ Res.SeterRorCode (string.valueof (response.getStatus ())) ؛ res.seterrormsg (response.getStatusinfo (). toString ()) ؛ Res.Setok (false) ؛ عودة الدقة ؛ }}/** * الانتباه: * التفاصيل: أدخل سجل * Author chhliu */public productsg <Githubentity> حفظ (كيان githubentity النهائي) يلقي jsonpriceStingexception ، iOexception {webTarget = client.target ("http: // localhost: 8080"). generictype <prodepmsg <githubentity >> generictype = new GenericType <resultmsg <githubentity> () {} ؛ استجابة الاستجابة = target.request (). BuildPost (intity.entity (Entity ، MediaType.Application_json)). Invoke () ؛ if (response.getStatus () == 200) {return response.Readentity (generictype) ؛ } else {prodepmsg <GitHubentity> res = new prodemmsg <githubentity> () ؛ Res.SeterRorCode (string.valueof (response.getStatus ())) ؛ res.seterrormsg (response.getStatusinfo (). toString ()) ؛ Res.Setok (false) ؛ عودة الدقة ؛ }}} شرح مفصل لواجهة عميل جيرسي
1 واجهة العميل
يتم إنشاء مثيل عميل من خلال ClientBuilder. عادة ما يتم استخدام مثيل ClientConfig كمعلمة. إذا استخدمنا Client Client = clientbuilder.newckist () لإنشاء مثيل عميل ، فسنقوم بإنشاء مثيل عميل في كل مرة ، ولكن المثيل هو كائن ثقيل. لذلك ، يوصى باستخدام تجميع اتصال HTTP لإدارة الاتصالات ، بدلاً من إنشاء كائن عميل في كل مرة نطلبها. للاطلاع على طرق إدارة تجمعات الاتصال المحددة ، راجع مثال الرمز أعلاه.
2 واجهة Webtarget
واجهة WebTarget هي واجهة تنفذ وضع الموارد لعملاء REST. من خلال واجهة WebTarget ، يمكننا تحديد العنوان المحدد للموارد المطلوبة ، ومعلمات الاستعلام ومعلومات نوع الوسائط ، وما إلى ذلك. يمكننا إكمال تكوين مثيل WebTarget من خلال سلسلة طريقة ، ولكن تجدر الإشارة إلى أنه على الرغم من أن طريقة استخدام الهدف الإلكتروني تشبه إلى حد كبير سلسلة طريقة StringBuffer ، إلا أنها مختلفة بشكل أساسي. يجب أن تقوم سلسلة طريقة الهدف الإلكتروني بتعيين قيمة إرجاع الطريقة كمقبض للعملية اللاحقة. ماذا يعني هذا؟ انظر الأمثلة التالية:
مثال 1: سلسلة سلسلة StringBuffer مثال
StringBuffer SB = New StringBuffer ("LCH") ؛ SB.Append ("Hello") ؛ SB.Append ("World") ؛ SB.Append ("Hello"). إلحاق ("World") ؛ // هذه الطريقة هي نفس سطر الرمز أعلاه.مثال 2: سلسلة طريقة WebTarget Method مثال
// استخدم سلسلة طريقة رمز خط واحد لتثبيت WebTarget WebTarget WebTarget = client.target ("http: // localhost: 8080") ؛ WebTarget.path ("/github/get/user/page") .queryparam ("pageoffset" ، pageoffset) .queryparam ("pagesize" ، pagesize) .queryparam ("OrderColumn" ، OrderColumn) ؛ // هنا هو استخدام سلاسل الأسلوب لتثبيت WebTarget WebTarget.path ("/github/get/user/page") ؛ webtarget.queryparam ("pageoffset" ، pageOffset) ؛ webtarget.queryparam ("pagesize" ، pagesize) ؛ // نتائج طريقت اثنين أعلاه مختلفة جدا. طريقة الاستئصال أعلاه على ما يرام ، لا توجد مشكلة ، ولكن طريقة التأسيس التالية لديها مشاكل. في طريقة الاستئصال التالية ، سيقوم كل صف بإنشاء كائن A // الجديد على شبكة الإنترنت. لم تلعب هدف الويب الأصلي أي دور. بعد كل شيء ، حالات كل صف مختلفة. إذا أردنا إنشاء مثيل له في صفوف متعددة ، فيجب علينا تقديم مقبض لإرجاع كل طريقة. الطريقة كما يلي: WebTarget Target = client.target ("http: // localhost: 8080") ؛ WebTarget PathTarget = Target.Path ("/github/get/user/page") ؛ WebTarget ParamTarget = pathtarget.queryparam ("pageoffset" ، pageOffset) ؛ // عند استخدامه أخيرًا ، استخدم كائن مثيل WebTarget الأخير 3 واجهة الاحتجاج
واجهة الاحتجاج هي واجهة تبدأ طلبًا إلى خادم REST بعد استكمال تكوين تحديد موقع الموارد. يتضمن الطلب طريقتين: التزامن وغير متزامن. يتم تعريفه بواسطة واجهة البناء داخل واجهة الاحتجاج. ترث واجهة البناء syncinvoker واجهة التزامن. أمثلة المكالمات غير المتزامنة هي كما يلي:
المستقبل <resultmsg <list <githubentity >>> استجابة = invocationBuilder.async (). get (generictype) ؛ if (response.isdone ()) {return response.get () ؛ } ينفذ مثيل واجهة invocation.builder و Post request لإرسال الاستعلامات والإنشاء على التوالي. بشكل افتراضي ، فإن نوع الإرجاع لدعوة طريقة HTTP هو نوع الاستجابة ، كما يدعم قيمة الإرجاع للنوع العام. في المثال أعلاه ، استخدمنا عددًا كبيرًا من الأدوية ، لذلك لن نوضح كثيرًا هنا.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.