بسبب متطلبات المشروع ، يلزم التواصل بين النظامين. بعد بعض الأبحاث ، تقرر استخدام طلب HTTP.
لا يوجد ما يقوله عن الخادم. يتم استخدامه في الأصل للوصول إليه باستخدام صفحات الويب. لذلك ، بعد بدء تشغيل الحذاء الربيعي ، يتم تعريض واجهة طبقة التحكم تلقائيًا. يمكن للعميل فقط الاتصال بعنوان URL المقابل ، لذا هنا هو العميل بشكل أساسي.
أولاً ، قمت بتخصيص جهاز Tool Class DeviceFactoryHTTP لمعالجة طلبات HTTP. نظرًا لأن الوصول إلى عنوان URL ، هناك مشكلتان يجب التعامل معهما ، أحدهما هو عنوان URL الذي يطلب الخدمة ومعلمات خادم الطلب. يطلب رأس الرسالة للعميل عنوان URL للخدمة: اطلب عنوان URL الخادم الذي أعرّفه هو نفس معلمات عنوان URL مثل العميل: هناك نوعان من المعلمات على الخادم مغلفة ، على غرار ما يلي:
http: // localhost: 8080/switch/getallstatus؟ data {"اسم الواجهة": "getAllstudentstaus"}
لا يتم تغليف واحد ، على غرار ما يلي:
http: // localhost: 8080/switch/getStudentInFobyname؟ name = Zhangsan
أولاً ، يتم تغليفه:
1: تهيئة httpclient
عميل httpclient ثابت ثابت = فارغ ؛ ثابت {poolinghttpclientConnectionManager cm = new poolingHttpClientConnectionManager () ؛ cm.setMaxTotal (128) ؛ cm.setDefaultMaxperRoute (128) ؛ Client = httpclients.custom (). setConnectionManager (cm) .build () ؛ }الثاني: احصل على عنوان URL المطلوب ، لأن عنوان URL المحدد بواسطة الخادم الخاص بي هو نفسه العميل ، لذلك أستخدم عنوان URL الخاص بالعميل المطلوب مباشرة
// احصل على urlpublic stringbuffer geturltorequest (httpservletrequest request) {StringBuffer url = request.getRequesturl () ؛ // الحصول على عنوان URL المطلوب (http: // localhost: 8080/switch studentinfoByname) سلسلة appname = splitarr [3] ؛ // اسم المشروع سلسلة iPreport = splitarr [2] إرجاع New StringBuffer (النتائج) ؛ }احصل على عنوان URL إلى الانقسام وفقًا لـ /، لأنني أختبر البيئة ، IP لبيئة الإنتاج ، رقم المنفذ (اسم المجال) ليس محليًا ، سيضيف البعض اسم المشروع قبل ذلك ، لذلك سأستبدل القيمة المقابلة للانقسام.
ثلاثة: قم بتجميع معلمات الطلب واتصل بطلب HTTP
/*** إرسال طلب http مع طلب* اتصل بطبقة وحدة التحكم* param طلب* regurn*/السلسلة العامة sendhttptodevfac (طلب httpservletrequest) رمي استثناء {httpclient client = null ؛ String ReturnResult = "" ؛ // http: // localhost: 8080/leo/1.0/h5/تسجيل الدخول urlbuffer urlbuffer = geturltorequest (طلب) ؛ سلسلة encoderData = urlencoder.encode (DataAsjson ، "UTF-8") ؛ httpget get = new httpget (urlbuffer.append ("؟؟ data ="). append (encoderData) .ToString ()) ؛ // تعيين headersenumeration <string> أسماء الرأس = request.getheaderNames () ؛ بينما (headernames.hasmoreElements ()) {String headername = headernames.nextElement () ؛ String headervalue = request.getheader (اسم الرأس) ؛ Get.Setheader (اسم الرأس ، headervalue) ؛ } client = devicefactoryhttp.client ؛ logger.info ("بدء استدعاء http ، طلب url:"+urlbuffer.toString ()) ؛ httpresponse rep = client.execute (get) ؛ returnResult = entityUtils.ToString (rep.getentity () ، "utf-8") ؛ logger.info ("HTTP request call call !!") ؛ return ReturnResult ؛ }احصل أولاً على المعلمات المطلوبة ، ثم قم بتجميع المعلمات خلف عنوان URL. لا تنسى urlencoder.encode. وذلك لأن المعلمات سيكون لها بعض الرموز. تحتاج إلى تشفير المعلمات قبل إضافة عنوان URL. خلاف ذلك ، سيتم طرح استثناء. تعيين الرؤوس: نظرًا لأن بعض خوادم المعلومات ستخرجها من رأس الطلب ، قمت أيضًا بتعيين رأس طلب العميل على طلب الخادم. يمكن ربط عنوان URL المطلوب والمعلمات المطلوبة و Client.exceute (الحصول على) لتنفيذ الطلب.
ما سبق هو أن المستعرض الخاص بي يمرر طلب طلب الطلب مباشرة كمعلمة إلى موكلي ، حتى أتمكن من الحصول على عنوان URL مباشرة من الطلب. البعض ليس لديهم طلب ، لذلك أحتاج إلى الحصول عليه من سياق الطلب.
فك:
أولا احصل على الطلب
/*** احصل على طلب* @RETURN*/static httpservletrequest getRequest () {servletRequestatTributes ra = (servletRequestAttributes) requestContextholder.getRequestAttributes () ؛ طلب httpservletrequest = ra.getRequest () ؛ طلب العودة ؛ }2: بعد الطلب ، هناك عنوان URL. دعنا نحلّم معلمات الطلب ، لأن هذه المعلمة غير مغلفة ، لذلك يتم الحصول على جميع معلمات الطلب.
/** * لا يوجد طلب طلب ، اتصل بطبقة وحدة التحكم * @param مفتاح * param interfacename * param سلاسل * return * athrows استثناء */السلسلة العامة contertodevicefacnorequest (مفتاح السلسلة ، سلسلة interfacename) يلقي الاستثناء {try {httpservletrequest reuquest طلب المعلمة تعداد <string> names = request.getParameterNames () ؛ الخريطة <string ، string> parammap = new hashmap <> () ؛ // transtraight request Map بينما (names.hasmoreElements ()) {string name = names.nextElement () ؛ قيمة السلسلة = (سلسلة) request.getParameter (name) ؛ parammap.put (الاسم ، القيمة) ؛ }. } catch (استثناء e) {E.PrintStackTrace () ؛ } // end return null ؛ } ثلاثة: أرسل طلب HTTP
/ ** * إرسال طلب http ، [بدون بيانات] * @REGRINT */ سلسلة عامة sendhttptodevaCnodata (خريطة <سلسلة ، سلسلة> parammap ، httpservletrequest) يلقي استثناء {httpclient client = null ؛ نتيجة السلسلة = "" ؛ stringbuffer databuffer = geturltorequest (request) ؛ // get url databuffer.append ("؟") ؛ client = devicefactoryhttp.client ؛ iterator <intern <string ، string >> paamit = parammap.entryset (). iterator () ؛ بينما (paamit.hasnext ()) {intern <string ، string> entrate = paamit.next () ؛ databuffer.append (intrad.getKey ()). إلحاق ("="). إلحاق (intrad.getValue ()). إلحاق ("&") ؛ } string resulturl = databuffer.toString (). substring (0 ، databuffer.toString (). lastIndExof ("&")) ؛ // إرسال طلب httpget get = new httpget (resulturl) ؛ // تعيين رؤوس التعداد <string> headernames = request.getheaderNames () ؛ بينما (headernames.hasmoreElements ()) {String headername = headernames.nextElement () ؛ String headervalue = request.getheader (اسم الرأس) ؛ Get.Setheader (اسم الرأس ، headervalue) ؛ } httpresponse rep = client.execute (get) ؛ logger.info ("ابدأ استدعاء طلب http ، طلب url:"+resulturl) ؛ // return return = entityUtils.ToString (rep.getentity () ، "utf-8") ؛ logger.info ("HTTP طلب الاتصال ينتهي !!") ؛ نتيجة العودة }ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.