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

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

نشرت في المجموعة
عنوان الموضوع في الحقيقة سؤال، لأنه... أنا شخصياً لا أعرف ما هو ولأول مرة سأحاول العمل معه في إطار هذه المقالة. الشيء الوحيد الذي يمكنني ضمانه هو أن الكود الموضح أدناه سيعمل، لكن عباراتي ستكون مجرد افتراضات وتخمينات حول كيفية فهمي لكل هذا بنفسي. إذا هيا بنا... خدمات الويب.  الخطوة 1. ما هي خدمة الويب وكيفية العمل معها؟  - 1

مقدمة

علينا أن نبدأ بالسبب وراء إنشاء مفهوم خدمات الويب. بحلول الوقت الذي ظهر فيه هذا المفهوم في العالم، كانت التقنيات موجودة بالفعل، مما سمح للتطبيقات بالتفاعل عن بعد، حيث يمكن لبرنامج واحد استدعاء طريقة ما في برنامج آخر، والتي يمكن إطلاقها على جهاز كمبيوتر موجود في مدينة أخرى أو حتى بلد. يتم اختصار كل هذا كـ RPC (استدعاء الإجراء البعيد). تتضمن الأمثلة تقنيات CORBA، وJava - RMI (استدعاء الطريقة عن بعد). ويبدو أن كل شيء على ما يرام فيهم، وخاصة في كوربا، لأن... يمكنك العمل معها بأي لغة برمجة، ولكن لا يزال هناك شيء مفقود. أعتقد أن عيب CORBA هو أنه يعمل من خلال بعض بروتوكولات الشبكة الخاصة به بدلاً من HTTP البسيط، والذي يتناسب مع أي جدار حماية. كانت فكرة خدمة الويب هي إنشاء RPC الذي سيتم إدراجه في حزم HTTP. وهكذا بدأ تطوير المعيار. ما هي المفاهيم الأساسية لهذا المعيار:
  1. صابون . قبل استدعاء إجراء بعيد، تحتاج إلى وصف هذا الاستدعاء في ملف XML بتنسيق SOAP. يعد SOAP ببساطة أحد علامات XML العديدة المستخدمة في خدمات الويب. كل ما نريد إرساله إلى مكان ما عبر HTTP يتم تحويله أولاً إلى وصف XML SOAP، ثم يتم حشوه في حزمة HTTP وإرساله إلى كمبيوتر آخر على الشبكة عبر TCP/IP.
  2. WSDL . هناك خدمة ويب، أي. برنامج يمكن استدعاء أساليبه عن بعد. لكن المعيار يتطلب أن يكون هذا البرنامج مصحوبًا بوصف يقول "نعم، أنت على حق - إنها حقًا خدمة ويب ويمكنك استدعاء طرق كذا وكذا منها". يتم تمثيل هذا الوصف بملف XML آخر، له تنسيق مختلف، وهو WSDL. أولئك. WSDL هو مجرد ملف XML يصف خدمة ويب وليس أكثر.
لماذا تسأل لفترة وجيزة؟ ألا يمكنك أن تكون أكثر تحديداً؟ ربما يكون ذلك ممكنًا، ولكن للقيام بذلك سيتعين عليك الرجوع إلى كتب مثل T. Mashnin، "Java Web Services". هناك، في أول 200 صفحة، يوجد وصف تفصيلي لكل علامة من معايير SOAP وWSDL. هل يستحق القيام به؟ من وجهة نظري لا، لأن... يتم إنشاء كل هذا تلقائيًا في Java، وما عليك سوى كتابة محتويات الطرق التي من المفترض أن يتم استدعاؤها عن بعد. لذلك، ظهرت واجهة برمجة التطبيقات (API) مثل JAX-RPC في Java. إذا كان أي شخص لا يعرف، عندما يقول أن Java لديها واجهة برمجة تطبيقات كذا وكذا، فهذا يعني أن هناك حزمة تحتوي على مجموعة من الفئات التي تغلف التكنولوجيا المعنية. تطورت JAX-RPC بمرور الوقت من إصدار إلى إصدار وأصبحت في النهاية JAX-WS. من الواضح أن WS تعني WebService وقد تعتقد أن هذا مجرد إعادة تسمية لـ RPC باعتبارها كلمة طنانة شائعة هذه الأيام. وهذا غير صحيح، لأن لقد ابتعدت خدمات الويب الآن عن الفكرة الأصلية وتسمح لك ليس فقط بالاتصال بالطرق البعيدة، ولكن أيضًا بإرسال رسائل المستندات بتنسيق SOAP. لا أعرف سبب الحاجة إلى هذا حتى الآن؛ فمن غير المرجح أن تكون الإجابة هنا "فقط في حالة الحاجة إليه". أنا نفسي أود أن أتعلم من الرفاق الأكثر خبرة. وأخيرًا، ظهر JAX-RS لما يسمى بخدمات الويب RESTful، ولكن هذا موضوع مقال منفصل. المقدمة يمكن أن تنتهي هنا، لأن... بعد ذلك سوف نتعلم كيفية العمل مع JAX-WS.

النهج العام

في خدمات الويب يوجد دائمًا عميل وخادم. الخادم هو خدمة الويب الخاصة بنا ويسمى أحيانًا نقطة النهاية (كما هو الحال في نقطة النهاية حيث تصل رسائل SOAP من العميل). نحن بحاجة إلى القيام بما يلي:
  1. وصف واجهة خدمة الويب لدينا
  2. تنفيذ هذه الواجهة
  3. إطلاق خدمة الويب لدينا
  4. اكتب عميلاً واتصل عن بعد بطريقة خدمة الويب المطلوبة
يمكنك تشغيل خدمة ويب بطرق مختلفة: إما وصف فئة بطريقة معينة mainوتشغيل خدمة الويب مباشرة كخادم، أو نشرها على خادم مثل Tomcat أو أي خادم آخر. في الحالة الثانية، نحن أنفسنا لا نقوم بتشغيل خادم جديد ولا نفتح منفذًا آخر على الكمبيوتر، ولكن ببساطة نقول لحاوية Tomcat servlet "لقد كتبنا فئات خدمة الويب هنا، يرجى نشرها حتى يتمكن كل من يتصل بك من الاتصال بك" استخدم استخدامنا لخدمة الويب." بغض النظر عن طريقة إطلاق خدمة الويب، سيكون لدينا نفس العميل.

الخادم

هيا نطلق IDEA وننشئ مشروعًا جديدًا Create New Project . حدد اسم HelloWebService وانقر فوق الزر " التالي "، ثم الزر "إنهاء" . في المجلد src سنقوم بإنشاء الحزمة ru.javarush.ws . في هذه الحزمة سوف نقوم بإنشاء واجهة HelloWebService:
package ru.javarush.ws;

// это аннотации, т.е. способ отметить наши классы и методы,
// How связанные с веб-сервисной технологией
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

// говорим, что наш интерфейс будет работать How веб-сервис
@WebService
// говорим, что веб-сервис будет использоваться для вызова методов
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface HelloWebService {
    // говорим, что этот метод можно вызывать удаленно
    @WebMethod
    public String getHelloString(String name);
}
في هذا الكود، تُسمى الفئات بالتعليقات التوضيحية WebServiceولا WebMethodتفعل شيئًا سوى وضع علامة على واجهتنا وطريقتها كخدمة ويب. وينطبق الشيء نفسه على الطبقة SOAPBinding. والفرق الوحيد هو أنه SOAPBindingعبارة عن تعليق توضيحي مع المعلمات. في هذه الحالة، يتم استخدام معلمة styleبقيمة تشير إلى أن خدمة الويب لن تعمل من خلال رسائل المستندات، ولكن كـ RPC كلاسيكي، أي. لاستدعاء طريقة. دعونا ننفذ منطق الواجهة الخاص بنا وننشئ فئة في الحزمة الخاصة بنا HelloWebServiceImpl. بالمناسبة، ألاحظ أن إنهاء الفصل باستخدام Impl هو تقليد في Java، والذي بموجبه يتم تحديد تنفيذ الواجهات (Impl - من كلمة التنفيذ، أي التنفيذ). وهذا ليس شرطا ولك الحرية في تسمية الفصل بما تريد، ولكن حسن الخلق يقتضي ذلك:
package ru.javarush.ws;

// таже annotation, что и при описании интерфейса,
import javax.jws.WebService;

// но здесь используется с параметром endpointInterface,
// указывающим полное Name класса интерфейса нашего веб-сервиса
@WebService(endpointInterface = "ru.javarush.ws.HelloWebService")
public class HelloWebServiceImpl implements HelloWebService {
    @Override
    public String getHelloString(String name) {
        // просто возвращаем приветствие
        return "Hello, " + name + "!";
    }
}
دعونا نطلق خدمة الويب الخاصة بنا كخادم مستقل، أي. دون مشاركة أي من Tomcat وخوادم التطبيقات (هذا موضوع لمناقشة منفصلة). للقيام بذلك، في بنية المشروع في المجلد src ، سنقوم بإنشاء حزمة ru.javarush.endpoint، وفيها سنقوم بإنشاء فئة HelloWebServicePublisherمع طريقة main:
package ru.javarush.endpoint;

// класс, для запуска веб-serverа с веб-сервисами
import javax.xml.ws.Endpoint;
// класс нашего веб-сервиса
import ru.javarush.ws.HelloWebServiceImpl;

public class HelloWebServicePublisher {
    public static void main(String... args) {
        // запускаем веб-server на порту 1986
        // и по addressу, указанному в первом аргументе,
        // запускаем веб-сервис, передаваемый во втором аргументе
        Endpoint.publish("http://localhost:1986/wss/hello", new HelloWebServiceImpl());
    }
}
لنقم الآن بتشغيل هذه الفئة بالضغط على Shift+F10 . لن يظهر أي شيء في وحدة التحكم، لكن الخادم قيد التشغيل. يمكنك التحقق من ذلك عن طريق كتابة السطر http://localhost:1986/wss/hello?wsdl في متصفحك . تثبت الصفحة التي يتم فتحها، من ناحية، أن لدينا خادم ويب (http://) يعمل على المنفذ 1986 على جهاز الكمبيوتر الخاص بنا (المضيف المحلي)، ومن ناحية أخرى، تعرض وصف WSDL لخدمة الويب الخاصة بنا. إذا أوقفت التطبيق، سيصبح الوصف غير متاح، وكذلك خدمة الويب نفسها، لذلك لن نفعل ذلك، بل ننتقل إلى كتابة العميل.

عميل

في مجلد المشروع src سنقوم بإنشاء حزمة ru.javarush.clientوفيها فئة تحتوي HelloWebServiceClientعلى طريقة main:
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"));
    }
}
لقد قدمت الحد الأقصى من التعليقات على الكود الموجود في القائمة. ليس لدي ما أضيفه، لذلك دعونا نجري (Shift+F10). يجب أن نرى النص في وحدة التحكم: Hello, JavaRush!إذا لم تراه، فمن المحتمل أنك نسيت تشغيل خدمة الويب.

خاتمة

قدم هذا الموضوع رحلة قصيرة إلى خدمات الويب. مرة أخرى، سأقول إن الكثير مما كتبته هو تخميني فيما يتعلق بكيفية عمله، وبالتالي لا ينبغي أن تثق بي كثيرًا. سأكون ممتنًا إذا قام الأشخاص المطلعون بتصحيحي، لأنني سأتعلم شيئًا ما بعد ذلك. محدث. دعونا نواصل المحادثة
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION