JavaRush /مدونة جافا /Random-AR /خدمات الويب. الخطوة 2. كيفية تبسيط كتابة العميل؟
eGarmin
مستوى

خدمات الويب. الخطوة 2. كيفية تبسيط كتابة العميل؟

نشرت في المجموعة
في هذه الملاحظة السريعة، أود إعادة النظر في كود عميل خدمة الويب الذي كتبناه في الخطوة السابقة . في هذه الحالة، سأفترض أن لديك IDEA مفتوحًا، وفيه المشروع من الخطوة 1. يجب إطلاق خدمة الويب الخاصة بنا في هذا المشروع:
package ru.javarush.client;

// нужно, чтобы получить wsdl описание и через него
// дотянуться до самого веб-сервиса
import java.net.URL;
// такой эксепшн возникнет при работе с an objectом URL
import java.net.MalformedURLException;

// классы, чтобы пропарсить xml-ку c wsdl описанием
// и дотянуться до тега service в нем
import javax.xml.namespace.QName;
import javax.xml.ws.Service;

// интерфейс нашего веб-сервиса (нам больше и нужно)
import ru.javarush.ws.HelloWebService;

public class HelloWebServiceClient {
    public static void main(String[] args) throws MalformedURLException {
        // создаем ссылку на wsdl описание
        URL url = new URL("http://localhost:1986/wss/hello?wsdl");

        // Параметры следующего конструктора смотрим в самом первом теге WSDL описания - definitions
        // 1-ый аргумент смотрим в атрибуте targetNamespace
        // 2-ой аргумент смотрим в атрибуте name
        QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");

        // Теперь мы можем дотянуться до тега service в wsdl описании,
        Service service = Service.create(url, qname);
        // а далее и до вложенного в него тега port, чтобы
        // получить ссылку на удаленный от нас an object веб-сервиса
        HelloWebService hello = service.getPort(HelloWebService.class);

        // Ура! Теперь можно вызывать удаленный метод
        System.out.println(hello.getHelloString("JavaRush"));
    }
}
لاحظ مقدار ما نحتاج إلى معرفته مقدمًا. بالإضافة إلى أنك تحتاج إلى الوصول إلى وصف wsdl (بدون هذا، آسف، لا توجد طريقة):
URL url = new URL("http://localhost:1986/wss/hello?wsdl");
تحتاج إلى فتح ملف xml هذا بنفسك وإلقاء نظرة على العلامة definitionsوالسمات الموجودة فيه targetNamespaceواستدعاء nameالمنشئ QName:
QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");
فأنت بحاجة إلى الاتصال يدويًا بالعلامة service:
Service service = Service.create(url, qname);
وفيه إلى العلامة port:
HelloWebService hello = service.getPort(HelloWebService.class);
وبعد ذلك فقط يمكننا استدعاء الطريقة البعيدة:
hello.getHelloString("JavaRush")
والسؤال هو: هل لهذا السبب مات أجدادنا في ساحات القتال، حتى أننا الآن نفعل كل ذلك بأيدينا؟ وإذا لم تكن حتى خدمة الويب الخاصة بنا، ولكنها تابعة لشخص آخر. ثم ستكون هذه العملية أكثر إزعاجًا. تم تصميم تنسيق XML ليتم قراءته بواسطة الآلات، وليس البشر. لذلك دعونا نترك الآلة تقوم بالعمل القذر ونستمتع بالعملية. لهذا، لا نحتاج إلى القيام بأي شيء خاص، لأن... يتضمن SDK المفضل لدينا، والذي يسمى JDK في Java، أداة مساعدة خاصة تسمى wsimport . لكن أول الأشياء أولاً... أولاً، لنقم بإنشاء مشروع جديد في IDEA عن طريق تحديد File > New Project... من القائمة وإعطاء المشروع الاسم HelloWS . عندما يتم سؤالنا عن مكان فتح المشروع الذي تم إنشاؤه حديثًا، نحتاج إلى الإجابة نافذة جديدة ، على سبيل المثال. في نافذة جديدة، لأنني سأشير مرة أخرى إلى أنه من المهم جدًا أن يكون المشروع السابق مفتوحًا، لأنه نتذكر من الخطوة 1 أن لدينا خدمة الويب الخاصة بنا قيد التشغيل في هذا المشروع. يمكنك، بالطبع، تشغيله ببساطة من خلال وحدة تحكم Windows، لكنني لا أحب القيام بذلك. من المشروع الجديد، افتح وحدة التحكم عن طريق تحديد View > Tool Windows > Terminal ، أو ببساطة الضغط على Alt+F12 . نحن الآن في جذر المشروع، ونحتاج إلى الدخول إلى مجلد src ، لذلك نقوم بإدخال الأمر التالي في وحدة التحكم: cd src حان الوقت الآن لاستخدام الأداة المساعدة wsimport . إنه يعمل على المبدأ التالي: نمرر له وصف WSDL ، واستجابة لذلك يقوم بإنشاء ملفات كعب الروتين (ما يسمى Stub-classes)، والتي تحتوي بالفعل على جميع الوظائف التي نحتاجها للوصول إلى خدمة الويب. سيتم وضع هذه الفئات في الحزمة ru.javarush.ws. إذا سألت من أين يأتي اسم الحزمة، فالإجابة هي: اسم الحزمة هو مساحة الاسم الهدف المعكوسة من وصف WSDL . تذكر السمة targetNamespaceالموجودة في العلامة definitionsمن WSDL . هناك كان لدينا ما يلي مكتوب http:// ws.javarush.ru/. وهذا ليس عنوان الموقع، هذه هي الطريقة المعتادة لوصف مساحات الأسماء في XML، وإذا قمنا بتجاهل http://وتوسيع ما تبقى بترتيب عكسي، فسنحصل على اسم الحزمة الخاصة بنا. لذا، فلنقم بتشغيل الأداة المساعدة: wsimport -keep http://localhost:1986/wss/hello?wsdl لكي تعمل، يجب تحديد المسار إليها في متغير بيئة PATH ، أو يمكنك ببساطة استخدام المسار الكامل لها. بالنسبة لي فهو موجود في المجلد C:\Program Files\Java\jdk1.8.0_31\bin . يرجى ملاحظة أن كل ما عليك فعله هو تمرير ملف WSDL عبر مفتاح –keep ، المتوفر عن بعد عبر رابط، ما لم نقوم بالطبع بتعطيل خدمة الويب. ما هي هذه الفئات كعب؟ لا يوجد سوى اثنين منهم. واحد منهم هوHelloWebService، وهي في الأساس نفس واجهة خدمة الويب التي أنشأناها يدويًا في الخطوة 1. الفرق ضئيل ويكمن في حقيقة أن التعليقات التوضيحية التي واجهناها بالفعل تُستخدم بشكل مختلف قليلاً، وبالإضافة إلى ذلك، يتم استخدام التعليقات التوضيحية الإضافية، والتي لقد ذكرت أنني لا أعرف أي شيء، ولكن نظرًا لأن كل شيء كان يعمل معنا من قبل بدونها، فمن الواضح أنها ليست إلزامية. الطبقة الثانية هي كعب HelloWebServiceImplService، الذي يرث من الطبقة Service. لقد واجهنا بالفعل الفصل Serviceفي عملائنا. لن أعطي رمز هذه الفئة، لأن... أنا بالكاد مستعد لشرح كل سطوره، لكن جوهر الفصل يتلخص في حقيقة أن كل ما كتبناه سابقًا في العميل يدويًا للاتصال بخدمة الويب يتم إنشاؤه تلقائيًا في هذا الفصل ونحتاج فقط إلى اتصل بإحدى طرقه وسيكون لدينا كل شيء مخرمًا. لذلك دعونا نعيد كتابة كود العميل الخاص بنا في مشروع جديد باستخدام هذه الفئات ونتأكد من أن الكود أكثر إيجازًا. أولاً، في مجلد src الخاص بالمشروع الجديد، لنقم بإنشاء حزمة ru.javarush.clientوفيها فئة HelloWebServiceClientتحتوي على طريقة main:
package ru.javarush.client;

// подключаем классы-заглушки
import ru.javarush.ws.*;

public class HelloWebServiceClient {
    public static void main(String[] args) {
        // подключаемся к тегу service в wsdl описании
        HelloWebServiceImplService helloService = new HelloWebServiceImplService();
        // получив информацию из тега service подключаемся к самому веб-сервису
        HelloWebService hello = helloService.getHelloWebServiceImplPort();

        // обращаемся к веб-сервису и выводим результат в консоль
        System.out.println( hello.getHelloString("JavaRush Community") );
    }
}
يعد تحليل الكود أمرًا أساسيًا وما وصفته في التعليقات يكفي تمامًا. وبعد إطلاق العميل يجب أن نرى السطر: Hello, JavaRush Community!وفي نفس الوقت، سيستمر العميل من المشروع من الخطوة 1 في العمل وعرض نصه الذي كتبناه فيه، وهو: Hello, JavaRush! في هذه المرحلة ربما يمكننا إنهاء هذا خطوة، لأن وقد تحقق هدفه. لقد أدركنا أنه إذا كان هناك وصف WSDL لخدمة ويب، فإن jdk جاهز لتزويدنا بالإنشاء التلقائي stubلفئات كعب الروتين لتبسيط عملية كتابة عميل لخدمة الويب هذه. في رأيي، هذه ميزة مفيدة جدًا عندما تريد اختبار خدمة الويب الخاصة بشخص آخر وعدم إلقاء نظرة خاطفة على وصف WSDL الخاص بها . نظرة إلى المستقبل في المقالة التالية حول خدمات الويب، أود أن أعرض أفكارًا حول كيفية نشر خدمة ويب في حاوية Tomcat servlet وفي خوادم تطبيقات مختلفة، بحيث لا تحتاج إلى تشغيل خدمة الويب مثل تطبيق منفصل، كما فعلنا في الخطوتين الأوليين. ولكن قبل ذلك، أعتقد أنه سيكون من الأفضل إجراء استطراد قصير حول موضوع ما هي servlet وحاويات servlet وكيف تختلف عن خوادم التطبيقات والويب العادي... . بالإضافة إلى ذلك، سيتعين علينا تقديم لمحة موجزة عن خوادم التطبيقات ، والتي في رأيي تستحق اهتمامنا.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION