اكتب في المقدمة
هذه المقالة مكتوبة بتنسيق تخفيض. هذه هي المرة الأولى التي كتبت فيها هذا. قد يكون التصميم فوضويًا بعض الشيء ، وآمل أن تتمكن من مسامحة ذلك.
يكتب بشكل أساسي أن يستخدم الشريط لتقديم طلبات مريحة ، واختبار استخدام الطرق المختلفة ، والرمز زائد نسبيًا ، وهو أكثر ملاءمة للمبتدئين ، لذلك أمانع في إعطائها بخ. شكرًا لك.
فرضية
ملاحظة: في المقالة ، تحتاج إلى ترقية النسخة الوالدة من نماذج الربيع إلى 1.5.9.EALEASE أو أعلى (إصدار 1.3.7.release لا يحتوي على هذه التعليقات التوضيحية)
اقتراح: يحتوي كل تطبيق Microservice على Spring-Boot-Maven-Plugin و Maven-Compiler-Plugin ويحدد أن إصدار JDK المترجم هو 1.8. طريقة المواصفات كما يلي: أضفها في pom.xml
<Nudge> <ultionins> <lopl> <roupiD> org.springframework.boot </groupId> <StifactId> Spring-boot-maven-plugin </shintifactid> </sultcin> <clupin> <roupiD> org.apache.maven.plugins </groupid> <Source> 1.8 </ource> <varget> 1.8 </duction> </isplicuration> </sopplicin> </sugionins> </build>
اختبار بناء المشروع
مركز تسجيل Eureka: مزود خدمة إنشاء مركز التسجيل المرجعي: مزود خدمة التسجيل المرجعي
مستهلكو الشريط: اكتشاف الخدمة المرجعية والاستهلاك
بعد إنشاء المشروع ، تذكر أن تتبع ملف مضيفات التكوين المذكورة في هذه البرامج التعليمية.
من أجل منع الطلب في المشروع من كونه متماثلاً ، سنحذف جميع فئات وحدة التحكم (مقدمي الخدمات والمستهلكين). بعد ذلك ، سأقوم بتغليف كل طريقة مريحة في فصل للجميع لعرضه
احصل على الطلب
GetForentity: تحتوي هذه الطريقة على ثلاثة نماذج من الحمل الزائد ، وهي:
ملاحظة: تقوم هذه الطريقة بإرجاع استجابة كائن Wrapper <T> حيث تم تمرير Responype في النوع. إذا كنت ترغب في الحصول على نوع الإرجاع ، فأنت بحاجة إلى استخدام طريقة getBody () لكائن الغلاف هذا.
GetForObject: تحتوي هذه الطريقة أيضًا على ثلاثة نماذج محملة ، وهي نفس طريقة GetForentity:
ملاحظة: إن نوع الكائن الذي تم إرجاعه بواسطة هذه الطريقة هو ResponseType تم تمريره في النوع
لراحة الاختبار ، يتم توفير فئة المستخدم نفسها في مزود الخدمة ومستهلك الخدمة على التوالي لراحة الاختبار
package com.cnblogs.hellxz ؛/** * pojo لاختبار */مستخدم الفئة العامة {اسم السلسلة الخاصة ؛ جنسية سلسلة خاصة سلسلة سلسلة خاصة ؛ المستخدم العام () {} المستخدم العام (اسم السلسلة ، سلسلة الجنس ، سلسلة الهاتف) {this.name = name ؛ this.Sex = الجنس ؛ this.phone = الهاتف ؛ } السلسلة العامة toString () {return "user: {" + "name:" + name + "،" + "sex:" + sex + "،" + "phone:" + phone + "}" ؛ } السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } سلسلة عامة getSex () {return sex ؛ } public void setSex (سلسلة الجنس) {this.sex = sex ؛ } السلسلة العامة getPhone () {return phone ؛ } public void setphone (سلسلة الهاتف) {this.phone = phone ؛ }}أدناه نقوم بإنشاء getRequestController في مزود الخدمة
حزمة com.cnblogs.hellxz ؛ استيراد org.apache.log4j.logger ؛ استيراد org.springframework.beans.factory.antowired org.springframework.web.bind.annotation.* ؛/*** Author: Hellxz* description: خدمة الخدمة* date: 2018/4/18 11:36*/ @restControllerPublic Class GetRequestController {AtoWired Private DiscoveryClient Client ؛ // حقن الاكتشاف عميل العميل الخاص logger logger = logger.getLogger (getRequestController.class) ؛ /** * اذهب إلى مستقيم الاختبار */getMapping (value = "/"/hello ") السلسلة العامة Hello () {// الحصول على مثيل الخدمة ، والوظيفة هي عرض تأثير وحدة ServiceInstance ServiceInstance = client.getlocalserviceinstance () ؛ logger.info ("/hello host:"+serviceinstance.gethost ()+"service_id:"+serviceInstance.getServiceId ()) ؛ العودة "مرحبا" ؛ }/** * اختبار المعلمة */getMapping (value = "/greet/{dd}") سلسلة تحية عامة ( @سلسلة dd) logger.info ("/hello host:"+serviceinstance.gethost ()+"service_id:"+serviceInstance.getServiceId ()) ؛ إرجاع "مرحبا"+dd ؛ }/*** إرجاع كائن الاختبار*/getMapping ("/user") المستخدم العام getUser () {serviceinstance serviceInstance = client.getlocalserviceinstance () ؛ logger.info ("/user"+serviceinstance.gethost ()+"المنفذ:"+serviceInstance.getPort ()+"serviceInstanceId:"+serviceinstance.getServiceId ()) ؛ إرجاع مستخدم جديد ("Hellxz" ، "Male" ، "123456789") ؛ }/*** إرجاع الكائن وفقًا للاسم ، ويتم محاكاة عملية البحث في قاعدة البيانات هنا*/getMapping ("/user/{name}") المستخدم العام getUserSelect (اسم سلسلة pathvariable) {serviceinstance serviceinstance = client.getlocalserviceinstance () ؛ logger.info ("/user"+serviceinstance.gethost ()+"المنفذ:"+serviceInstance.getPort ()+"serviceInstanceId:"+serviceinstance.getServiceId ()) ؛ if (name.isempty ()) {return new user () ؛ } آخر إذا (name.equals ("hellxz")) {إرجاع مستخدم جديد ("Hellxz" ، "Male" ، "123456789") ؛ } آخر {إرجاع مستخدم جديد ("مستخدم عشوائي" ، "ذكر" ، "987654321") ؛ }}}بعد ذلك ، نقوم بإنشاء getRequestController في مشروع مستهلك الخدمة
حزمة com.cnblogs.hellxz ؛ استيراد org.apache.log4j.logger ؛ استيراد org.springframework.beans.factory.antow.autowired org.springframework.web.client.restTemplate ؛ استيراد org.springframework.web.util.uricomponents ؛ استيراد org.springframework.web.util.uricomponentsbuilder ؛ java.net.uri ؛ : Hellxz * description: وحدة تحكم تطبيق المستهلك الشريط ، احصل على طلب * date: 2018/4/16 15:54 */ @restControllerPublic class getRequestController {private logger logger = logger.getLogger (getRequestController.class) ؛ @autowired // enject resttemplate private resttemplate resttemplate ؛ /** * responseentity <T> getforentity (url url string ، class <T> responseType) * t getBody () الطريقة التالية هي نفسها */ @getMapping (value = "/intity/noparam") السلسلة العامة تم الإبلاغ عن // return resttemplate.getforentity ("http: // localhost: 8080/hello" ، string.class) .getBody () ؛ // استخدم RestTemplate لاستدعاء واجهة microservice resttemplate.getforentity ("http: // hello-service/hello" ، string.class) .getBody () ؛ }/** * responseentity <T> getforentity (url string url ، class <t> responseType ، Object ... urivariables) */getMapping ("/intity/type") المستخدم العام getForentityIdenTyPyPe () {// إرجاع نتيجة النوع المحدد دون تمرير استجابة المعلمة <Seter> entity = RestTemplate.getForentity ("http: // hello-service/user" ، user.class) ؛ مستخدم الجسم = entity.getBody () ؛ logger.info ("user:"+body) ؛ إرجاع الجسم // يمكن اختصار ما ورد أعلاه AS // return resttemplate.getforentity ("http: // hello-service/user" ، user.class) .getBody () ؛ }/** * responseentity <T> getforentity (url url string ، class <t> responseType ، object ... urivariables) * استخدم العناصر النائبة لاستبدال المعلمات ، واستخدام طريقة string.format داخليًا لتنفيذ */getMapping (value = "/entity") // إذا تم استخدام المعلمة المستلمة دون استخدامها؟ إذا كان الأمر كذلك ، فاستخدم @pathvariable ، وإلا ، استخدم requestparam السلسلة العامة getforentitybyquestionmarkparam ( @requestparam ("name") اسم السلسلة) {// الاختبارات الرئيسية في طريقة getentity ، هنا الاختبار مباشرة المعلمة resttemplate.getforentity ("http: hello-service/{1}" ، }/*** ستستخلص طريقة getforentity الخريطة داخليًا ، وقيمة مفتاح العنصر النائب هي backfill في عنوان url كمعلمة* استجابة <T> getforentity (url string ، class <T> rosesype ، map <string ،؟> urivariables) وإلا استخدم @requestparam السلسلة العامة getforentitybymap (pathvariable ("name") اسم السلسلة) {// الاختبارات الرئيسية طريقة getentity ، هنا يختبر خريطة معلمة الخريطة <string> reqmap = new hashmap () ؛ reqmap.put ("الاسم" ، الاسم) ؛ إرجاع resttemplate.getForentity ("http: // hello-service/greet/{name}" ، string.class ، reqmap) .getBody () ؛ }/** * استجابة <T> getForObject (URI url ، الفئة <T> ResponseType) */getMapping ("/intity/uri") السلسلة العامة getForentityByuri () {// استخدم URI لتمرير الوسيطات والوصول إلى uricomponents = uricomponentsbuilder.fromuristring ("http: // hello-service/really/{name}") .build (). توسيع ("laozhang") .encode () ؛ uri uri = uricomponents.touri () ؛ return resttemplate.getforentity (uri ، string.class) .getBody () ؛ }/** * t getForObject (url string ، class <t> responseType) */getMapping ("/object") مستخدم عام getForObjectWithNoparam () {// مقارنة مع طريقة getForentity ، يمكن الحصول على الكائن إرجاع getbody retrettemplate.getforoBject ("http: // hello-service/user" ، user.class) ؛ }/** * t getForObject (url string ، class <T> responseType ، map <string ،؟> urivariables) */getMapping ("/object/map") المستخدم العام getForObjectByMap () {// استخدم خريطة تمرير خريطة المعلمة <string ، string> parammap = new hashmap <> () ؛ parammap.put ("الاسم" ، "Hellxz") ؛ إرجاع resttemplate.getForObject ("http: // hello-service/user" ، user.class ، parammap) ؛ }/** * t getForObject (url string ، class <t> responseType ، Object ... urivariables) */getMapping ("/object/param/{name}") المستخدم العام getForObjectBaram ( @pathvariable اسم) }/** * t getForObject (URI url ، class <T> responseType) */getMapping ("/Object/uri/{name}") مستخدم عام getForObjectByuri (اسم سلسلة pathvariable) {uricomponents uricomponents = uricomponentsbuilder.fromuristring (" .build (). توسيع (اسم) .encode () ؛ uri uri = uricomponents.touri () ؛ إرجاع resttemplate.getForObject (uri ، user.class) ؛ }}ابدأ أولاً في مركز التسجيل ، ثم اختبره عن طريق الوصول إلى الواجهة المقدمة من المستهلك. يتم تشغيل كل هذه بالفعل من قبلي ، لذلك لن أكتب اختبارًا هنا.
طلب النشر
كل من طلب النشر والطلب لديهم *أساليب Forentity و *foroBject ، حيث تختلف قائمة المعلمات إلى حد ما. بالإضافة إلى هاتين الطريقتين ، هناك أيضًا طريقة postforlocation ، حيث يقدم Postforlocation المورد كطلب آخر ويعيد URI للمورد الجديد.
ما بعد الولادة: هناك ثلاثة أشكال زائدة من هذه الطريقة ، وهي:
ملاحظة: تقوم هذه الطريقة بإرجاع استجابة كائن Wrapper <T> حيث تم تمرير Responype في النوع. إذا كنت ترغب في الحصول على نوع الإرجاع ، فأنت بحاجة إلى استخدام طريقة getBody () لكائن الغلاف هذا.
postforoBject: تحتوي هذه الطريقة أيضًا على ثلاثة نماذج من الحمل الزائد ، وهي نفس طريقة ما بعد الولادة:
ملاحظة: إن نوع الكائن الذي تم إرجاعه بواسطة هذه الطريقة هو ResponseType تم تمريره في النوع
postforlocation: هناك أيضًا ثلاثة نماذج من الحمل الزائد في هذه الطريقة ، وهي:
ملاحظة: هذه الطريقة تُرجع URI للمورد الجديد. الفرق بين GetForentity و GetForObject و Postforentity و PostforObject هو أنه لا توجد حاجة لتحديد نوع الإرجاع في هذه الطريقة ، لأن نوع الإرجاع هو URI. لا يزال يتطلب عنصر نائب لتمرير الحجج من خلال كائن ... urivariables ، خريطة <string ،؟> urivariables. انظر جزء ما بعد الولادة من الكود.
في الاتجاه السابق ، أنشأنا postrequestControllers في المشاريع التي توفر مقدمي الخدمات والمستهلكين على التوالي.
كود الخدمة التالية بعد ذلك هو كما يلي:
حزمة com.shunneng.springcloudhelloworld ؛ استيراد org.apache.log4j.logger ؛ استيراد org.springframework.web.bind.annotation.*؛ java.net.uri ؛/** * author: hellxz * description: * date: 2018/4/18 10:21 */ @reprontrollerpublic class postrequestController {private logger logger = logger.getLogger (postrequestController.Class) ؛ /*** استلم كائن وأعيده مرة أخرى. طريقة postforentity/postforoBject هي شائعة*/postmapping ("/user") المستخدم العام returnuserByPost ( @requestbody user user) {logger.info ("/use interface"+user) ؛ إذا كان (user == null) يعيد مستخدمًا جديدًا ("هذا كائن فارغ" ، "" ، "") ؛ إرجاع المستخدم ؛ }/** * اختبر معلمات طريقة postforentity ، يمكنك الحكم مباشرة على الإخراج */postmapping ("/user/{str}") مستخدم المستخدم العام returnuserBypost ( @سلسلة pathvariable str ، مستخدم مستخدم requestbody) إذا كان (user == null) يعيد مستخدمًا جديدًا ("هذا كائن فارغ" ، "" ، "") ؛ إرجاع المستخدم ؛ }/** * إرجاع URI لأسلوب postforlocation */postmapping ("/location") public uri returnuri (مستخدم requestbody) {// محاكاة عنوان URL هنا ، قد لا يكون موقع المورد الحقيقي هنا uricomponents = uricomponentsbuilder.fromuristring ( .build (). توسيع (مستخدم) .encode () ؛ uri touri = uricomponents.touri () ؛ // لا أعرف ما هي المشكلة هنا. من الواضح أنه تم إنشاؤه ، ولكن يبدو أن logger.info ("/location uri:"+touri) ؛ إعادة توري. }}رمز المستهلك بعد الكوكرات:
package com.cnblogs.hellxz ؛ import org.apache.log4j.logger ؛ استيراد org.springframework.beans.factory.annotation.autowired org.springframework.web.bind.annotation.restController ؛ استيراد org.springframework.web.client.resttemplate ؛ import org.springframework.web.util.uricomponents * Author: Hellxz * description: جهاز تحكم طلب المستهلك في الشريط * date: 2018/4/18 9:47 */ @restControllerPublic Class postrequestController {private logger logger = logger.getLogger (postrequestController.class) ؛ @autowired private resttemplate resttemplate ؛ /** * استجابة <T> postforentity (عنوان url السلسلة ، طلب الكائن ، الفئة <T> ResponseType) * لم يتم ذكر عنوان URL للمعلمة. إذا لم يكن طلب الكائن كائنًا httpentity ، فسيتم تحويله تلقائيًا إلى كائن httpentity ومعاملته كجسم كامل ؛ * إذا كان كائن httpentity ، فسيتم معالجته مباشرة كهيئة ويحتوي على محتوى الرأس. * لن أتحدث عن طريقة إعادة الكتابة أدناه. طريقة الاستخدام هي نفسها تقريبًا مثل Getforentity. إذا كان مجرد كائن منشور بسيط ، فاستخدم الطريقة بدون كائن ... متغيرات أو متغيرات الخريطة. * postforentity (url url السلسلة ، طلب الكائن ، الفئة <T> responseType ، كائن ... urivariables) * postforentity (url string ، طلب الكائن ، فئة <T> مسؤول ، خريطة <سلسلة ،؟> urivariables) * * هنا سنتحدث عن المزالق التي واجهتها بالتفصيل: للقول ، استخدم العناصر النائبة لتمرير المعلمات في عنوان URL المطلوب من قبل المنشور ، وإذا لم يتم استخدام أي أصحاب نتوء في عنوان URL ، فإن هذه المعلمات الأخيرة التي تم تمريرها غير صالحة! * 2. إذا كان كائن طلب الكائن في الطريقة له نفس النوع مثل معلمة استلام مزود الخدمة ، فإن مزود الخدمة يحتاج فقط إلى استخدام requestbody لتلقي المعلمات. * 3. إذا تم استخدام كلاهما ، فهذا أكثر إثارة للاهتمام. تحتاج إلى تلقي معلمات في URI من خلال التعليق التوضيحي @PathVariable ، وتحتاج أيضًا إلى requestbody لتلقي الكائنات أو طلب Paramets لتلقي المعلمات وفقًا للحقول! * 4. إذا قمت بالإبلاغ عن خطأ ، فيرجى إلقاء نظرة فاحصة على العناصر الثلاثة التي كتبت أعلاه وتولي اهتمامًا لاستخدام معلمات مزود الخدمة والشروح. */ postmapping ("/ intity") المستخدم العام postforentity () {user user = new user ("hellxz1" ، "1" ، "678912345") ؛ استجابة <user> entity = restTemplate.postforentity ("http: // hello-service/user/{str}" ، user ، user.class ، "test parameters") ؛ مستخدم الجسم = entity.getBody () ؛ // جميع RestTemplate.*أساليب Forentity هي فئات التفاف ، والجسم هو جسم إرجاع نوع نوع الإرجاع ؛ }/*** تمرير المعلمات مع URI ، سيتم عرض نتائج الاختبار في محطة خدمة مزود الخدمة* استجابة <T> postforentity (URI url ، طلب الكائن ، الفئة <T> rospsype)*/postmapping ("/intity/uri") المستخدم العام postforrentitybyuri () Zhang "،" 1 "،" 678912345 ") ؛ ) uri touri = uricomponents.touri () ؛ // استخدم المستخدم لتمرير كائن مستخدم المعلمة = restTemplate.postForObject (Touri ، المستخدم ، user.class) ؛ كائن إرجاع ؛ } /*** عند اختبار طريقة postforoBject هنا ، فإن المعلمات التي يجب إيلاء الاهتمام بها كما هو موضح في الطريقة أعلاه. الفرق هو أنك لا تحتاج إلى getBody ، لذلك لن أشرح هنا * postforObject (url string ، طلب الكائن ، الفئة <T> responseType ، كائن ... urivariables) * postforoBject (url url string ، طلب الكائن ، class <T> responseType ، Object ... urivariables) postmapping ("/object") المستخدم العام postforoBject () {user user = new user ("hellxz2" ، "1" ، "123654987") ؛ // هنا يمر عنوان URL 1 للاتصال بواجهة في خادم مشروع مستخدم stripebody = restTemplate.postForObject ("http: // hello-service/user/1" ، user ، user.class) ؛ إرجاع الاستجابة ؛ } /*** هناك نوع آخر من طلب النشر: postforlocation. هناك أيضا ثلاثة أحمال زائدة هنا. بالإضافة إلى عدم تحديد نوع الإرجاع ، يكون الاستخدام هو نفسه ، ونوع الإرجاع هو كل URI ، لذلك لن أصفه * postforlocation (url url ، طلب الكائن ، الكائن ... urivariables) * postforlocation (url string ، request ، map <string ،؟ مستخدم جديد ("Hellxz3" ، "1" ، "987654321") ؛ uri uri = resttemplate.postforlocation ("http: // hello-service/location" ، user) ؛ // لا أعرف لماذا هو فارغ. هذه الطريقة هي للرجوع فقط. إذا كنت أعرف ما هو الموقف ، فسأعود لتغيير logger.info ("/موقع URI:"+uri) ؛ إرجاع أوري. }}ضع الطلب && حذف الطلب
طلب PUT أبسط من أساليب GET و POST. ليست هناك حاجة لتحديد نوع الإرجاع لطلب PUT ، وبالطبع لا توجد قيمة إرجاع. كما أنه ثلاثة أنواع من الأحمال الزائدة ، والتي هي في الأساس نفس الأنواع المكتوبة من قبل. لا أريد أن أقول المزيد هنا. كل من طلب الحذف وطلب PUT ليس لهما قيمة إرجاع. لا يهم إذا كتبته هنا على وجه التحديد. يتم سرد طرق هذين الطلبين بشكل منفصل. الكود مكتوب في فصل.
طريقة طلب PUT هي كما يلي:
طريقة طلب الحذف هي كما يلي:
أضف putanddeleterequestcontroller إلى مشروع المزود ، الرمز كما يلي
حزمة com.cnblogs.hellxz ؛ استيراد org.apache.log4j.logger ؛ استيراد org.springframework.web.bind.annotation. {private logger logger = logger.getLogger (putAndDeletErequestController.class) ؛ putMapping ("/put") public void put (requestbody user user) {logger.info ("/put"+user) ؛ } deletemapping ("/delete/{id}") public void delete ( @pathvariable id) {logger.info ("/delete id:"+id) ؛ }}أضف putanddeleterequestcontroller إلى مشروع المزود ، الرمز كما يلي
package com.cnblogs.hellxz ؛ import org.apache.log4j.logger ؛ استيراد org.springframework.beans.factory.antowired ؛ import org.springframework.web.bind.annotation. description: طلب طلب ، حذف الطلب ، المعلمات المفرطة في الأساس مثل العرض التوضيحي أعلاه ، ولن يتم سرده * date: 2018/4/19 13:43 */ @restControllerPublic class putrequestController {private logger = logger.getLogger (postrequestController.class) ؛ @autowired private resttemplate resttemplate ؛ /*** وضع مثال على الطلب ، يتم استخدام الطلبات بشكل عام كتعديل*/putmapping ("/put") public pub bum ( @requestbody user) {restTemplate.put ("http: // hello-service/put" ، user) ؛ }/*** حذف مثال طلب*/deletemapping ("/del/{id}") public void delete ( @pathvariable id) {restTemplate.delete ("http: // hello-service/delete/{1}" ، id) ؛ }}خاتمة
تم كتابة منشور المدونة هذا باستخدام Markdown. لا أعرف كيفية إضافة الأرقام التسلسلية ووظائف الرمز إلى كتلة الكود لأول مرة. قد لا يكون هذا مقالًا جيدًا ، لكنني أكتب منشور المدونة هذا لمدة يومين تقريبًا. إذا كان لديك أي اقتراحات جيدة ، فلا تتردد في التعليق والتبادل.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.