لقد استخدمت عطلة Qingming Festival لمراجعة المحتوى ذي الصلة لخدمة الويب وتلخيص مبدأ العمل لفترة وجيزة. للإشارة من قبل الأصدقاء المحتاجين وأنفسهم في المستقبل. إذا كان هناك أي مقالة غير لائقة ، فيرجى مطالبة أصدقائك بتقديم اقتراحات قيمة لتشجيع بعضهم البعض.
في خدمات الويب ، يجب أن نفهم أولاً معنى المصطلحات ذات الصلة: WSDL ، UDDI .... لن يتم تكرار مقدمة المصطلحات ذات الصلة هنا ، ولكن سيكون التركيز على المبدأ.
في خدمة الويب ، هناك ثلاثة أدوار: مزود الخدمة ، وطالب الخدمة والوسيط للخدمة. يوضح الشكل 1-1 العلاقة بين الثلاثة
يتضمن تطبيق خدمة ويب كاملة الخطوات التالية:
◆ تصميم مزودي خدمة الويب وتنفيذ خدمات الويب ، ونشر التصحيح الصحيح لخدمة الويب من خلال وسيط خدمة الويب وتسجيلها في مركز تسجيل UDDI ؛ (نشر)
◆ يطلب طلب خدمة الويب خدمة محددة من وسيط خدمة الويب ، والاستعلام الوسيط مركز تسجيل UDDI استنادًا إلى طلب العثور على خدمة تلبي الطلب ؛ (اكتشاف)
◆ يقوم الوسيط خدمة الويب بإرجاع معلومات وصف خدمة الويب التي تلبي الشروط إلى طلب خدمة الويب. تتم كتابة معلومات الوصف في WSDL ويمكن قراءتها بواسطة أجهزة مختلفة تدعم خدمات الويب ؛ (اكتشاف)
◆ استخدم معلومات الوصف (WSDL) التي تم إرجاعها من وسيط خدمة الويب لإنشاء رسائل الصابون المقابلة وإرسالها إلى مزود خدمة الويب لتحقيق مكالمة خدمة الويب ؛ (ملزم)
◆ يقوم مزود خدمة الويب بتنفيذ خدمة الويب المقابلة وفقًا لرسالة SOAP ويعيد نتيجة الخدمة إلى طالب خدمة الويب. (ملزم)
الشكل 1-1 بنية خدمة الويب
ملاحظة: وظيفة WSDL هي دليل خدمة الويب. يقوم مقدم الخدمة بإنشاء رسالة الصابون المقابلة بناءً على WSDL هذا. بعد تلقي رسالة طلب SOAP ، يربط مزود الخدمة الخدمة.
الرمز التالي هو تكوين servlet في web.xml
<!- عند صياغة معلمات التهيئة أو عناوين URL المخصصة إلى صفحات Servlet أو JSP ، يجب عليك أولاً تسمية صفحة Servlet أو JSP. يتم استخدام عنصر Servlet لإكمال هذه المهمة. -> <Servlet> <Srevlet-Name> UserService </servlet-name> <Servlet-class> com.sun.xml.ws.transport.http.servlet.wsservlet أولا عندما يتم تشغيله-> <trom-on-startup> 1 </load-on-startup> </servlet> <!-يوفر الخادم عنوان URL الافتراضي لـ servlet: http: // host/webapprefix/servletname ، في كثير من الأحيان ، يتم تغيير عنوان URL. -> <servlet mapping> <Servlet-Name> يصف UserService </servlet-name>! القسم الأخضر هو الواجهة الخارجية للخدمة. ابحث عن ملف jax-ws.xml المقابل (كما هو موضح أدناه) <endpoint name = "userport" evelopy = "cn.ujn.service.userservice" url-pattern = "/user"> </endpoint>
ثم يرتبط بفئة التنفيذ المقابلة ذات الصلة cn.ujn.service.userservice. يحتوي جسم رسالة طلب SOAP الذي يتم إرساله بواسطة العميل على اسم الطريقة ومعلومات المعلمة المطلوبة من قبل العميل.
فيما يلي هيئة رسالة الصابون التي تغليفها العميل (نقل البيانات مع الخادم في وضع JSON) (مظروف Rerquest Soap):
<soapenv: Envelope xmlns: soapenv = "http://schemas.xmlsoap.org/soap/envelope/" xmlns: xsi = "http://www.w3 </soapenv: الظرف>
ما يلي هو بروتوكول SOAP1.1 الذي يستدعي خدمة الويب
/*** استدعاء خدمة الويب من خلال بروتوكول SOAP1.1** text/xml يعتمد هذا على protocol soap1.1** param wsdl wsdl path* method method method method podyparam bodyparam podyparam podyparam podyparam phadedaramedarame phadedparam phadedparam phaderameters headerarameters headerarameters parameter هناك مساحة اسم للمعلمة body * regurn * @throws استثناء */ سلسلة ثابتة عامة invokebySoap11 (سلسلة WSDL ، طريقة السلسلة ، مساحة اسم السلسلة ، خريطة <سلسلة ، سلسلة> headerparameters ، خريطة <string ، string> bodyparameters ، boolean isbodyparametersns) throws {stringbuffer soapofresult = null ؛ // إزالة؟ wsdl ، احصل على قائمة الطريقة int = wsdl.length () ؛ wsdl = wsdl.substring (0 ، طول - 5) ؛ // إنشاء مثيل url مع سلسلة كمعلمات url url = url جديد (WSDL) ؛ // إنشاء اتصال httpurlConnection conn = (httpurlConnection) url.openconnection () ؛ // قم بتعيين طريقة الطلب conn.setRequestMethod ("post") ؛ // إذا كنت تخطط لاستخدام اتصال عنوان URL للإدخال ، فقم بتعيين علامة Doinput على Conn.SetDoInput True (True) ؛ // إذا كنت تخطط لاستخدام اتصال عنوان URL للإخراج ، فقم بتعيين علامة Doinput على Conn.SetDooutput True (True) ؛ // قم بتعيين السمة بشكل أساسي (KV) في HttpurlConnection request header conn.setRequestProperty ("type-type" ، "text/xml ؛ charset = utf-8") ؛ // احصل على دفق الإدخال (نسبة إلى العميل ، واستخدم OutputStream) OutputStream Out = conn.getOutputStream () ؛ // احصل على رسالة إصدار SOAP1.1 StringBuilder SB = New StringBuilder () ؛ sb.append ("<soap: Envelope xmlns: xsi =/" http://www.w3.org/2001/xmlschema-instance/ " Xmlns: soap =/"http://schemas.xmlsoap.org/soap/envelope//" ") ؛ sb.append ("xmlns: ns0 =/" " + namespace +"/"") ؛ sb.append (">") ؛ // تجميع رأس الرسالة if (headerparameters! = null) {sb.append ("<soap: header>") ؛ لـ (الإدخال <string ، string> headerParameter: headerParameters .entRyset ()) {sb.append ("<ns0:") ؛ sb.append (headerparameter.getKey ()) ؛ sb.append (">") ؛ sb.append (headerparameter.getValue ()) ؛ sb.append ("</ns0:") ؛ sb.append (headerparameter.getKey ()) ؛ sb.append (">") ؛ } sb.append ("</soap: header>") ؛ } // تجميع جسم الرسالة sb.append ("<soap: body> <ns0:") ؛ sb.append (الطريقة) ؛ sb.append (">") ؛ // معلمة الإدخال if (bodyParameters! = null) {for (entrate <string ، string> inpopharameter: bodyParameters .entRyset ()) {if (isbodyParametersns) {sb.append ("<ns0:") ؛ sb.append (inpopharameter.getKey ()) ؛ sb.append (">") ؛ sb.append (inpopharameter.getValue ()) ؛ sb.append ("</ns0:") ؛ sb.append (inpopharameter.getKey ()) ؛ sb.append (">") ؛ } آخر {sb.append ("<") ؛ sb.append (inpopharameter.getKey ()) ؛ sb.append (">") ؛ sb.append (inpopharameter.getValue ()) ؛ sb.append ("</") ؛ sb.append (inpopharameter.getKey ()) ؛ sb.append (">") ؛ }}} sb.append ("</ns0:") ؛ sb.append (الطريقة) ؛ sb.append ("> </soap: body> </soap: Envelope>") ؛ // test system.out.println (SB.ToString ()) ؛ // كتابة رسائل الصابون (نسبة إلى العميل ، Out.write () يتم استخدامها) Out.write (sb.toString (). getBytes ()) ؛ // احصل على رمز int المقابل على جانب الخادم = conn.getResPonsecode () ؛ if (code == 200) {inputStream is = conn.getInputStream () ؛ بايت [] ب = بايت جديد [1024] ؛ int len = 0 ؛ soapofresult = new StringBuffer () ؛ // اقرأ عددًا معينًا من البايتات من دفق الإدخال وتخزينها في صفيف المخزن المؤقت ب. إرجاع العدد الفعلي للبايت القراءة على أنها عدد صحيح // إذا لم تكن هناك بايت متاحة لأن الدفق في نهاية الملف ، فإن القيمة هي -1 ؛ بينما ((len = iS.Read (b))! = -1) {// يحول صفيف البايت إلى سلسلة باستخدام charset المسماة. سلسلة s = سلسلة جديدة (b ، 0 ، len ، "utf-8") ؛ soapofresult.append (s) ؛ }} conn.disconnect () ؛ إرجاع soapofresult == فارغ؟ null: soapofresult.toString () ؛ } ملاحظة: يتم حظر العميل بعد إرسال رسالة طلب SOAP. حتى يقوم الخادم بإرجاع رمز الحالة.
فيما يلي استجابة الخادم (مغلف استجابة الصابون):
<S: Envelope Xmlns: s = "http://schemas.xmlsoap.org/soap/envelope/">-<s: body>-<ns2: loginResponse xmlns: ns2 = "http://ujn.cn/" </s: body> </s: envelope>
بعد تلقي بيانات JSON التي أرسلها الخادم ، سيقوم العميل بإجراء عمليات التحليل المقابلة. على النحو التالي:
// تحليل بروتوكول SOAP (لا يمكن استخدام DOM إلا لتحليل أنواع مستندات XML ، في حين أن رسائل SOAP في تنسيق بيانات XML) مستند Doc = xmlutil.string2doc (النتيجة) ؛ element ele = (element) doc.getElementsByTagName ("return"). البند (0) ؛ طريقة string2doc () المستخدمة في الطريقة هي كما يلي: مستندات ثابتة string2doc (String str) {// تحليل مستند XML في مصنع DOM Tree DocumentBuilderfactory = documentBuilderFactory.newinstance () ؛ وثيقة المستند = فارغ ؛ DocumentBuilder Build ؛ if (str == null || str.equals ("")) {return null ؛ } جرب {inputStream bais = new ByTearRayInputStream (str.getBytes ("utf-8")) ؛ build = factory.newdocumentBuilder () ؛ // تحليل محتوى الإدخال المحدد كمستند XML وإرجاع كائن مستند DOM جديد. وثيقة = build.parse (bais) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } مستند الإرجاع ؛ } وفقًا لنتيجة الإرجاع ، سيقوم العميل بإجراء المعالجة المقابلة.
ما سبق هو مبدأ العمل الأساسي لخدمات الويب.
شكرا لك على القراءة ، آمل أن تساعدك. شكرا لك على دعمك لهذا الموقع!