عنوان الموضوع في الحقيقة سؤال، لأنه... أنا شخصياً لا أعرف ما هو ولأول مرة سأحاول العمل معه في إطار هذه المقالة. الشيء الوحيد الذي يمكنني ضمانه هو أن الكود الموضح أدناه سيعمل، لكن عباراتي ستكون مجرد افتراضات وتخمينات حول كيفية فهمي لكل هذا بنفسي. إذا هيا بنا...
مقدمة
علينا أن نبدأ بالسبب وراء إنشاء مفهوم خدمات الويب. بحلول الوقت الذي ظهر فيه هذا المفهوم في العالم، كانت التقنيات موجودة بالفعل، مما سمح للتطبيقات بالتفاعل عن بعد، حيث يمكن لبرنامج واحد استدعاء طريقة ما في برنامج آخر، والتي يمكن إطلاقها على جهاز كمبيوتر موجود في مدينة أخرى أو حتى بلد. يتم اختصار كل هذا كـ RPC (استدعاء الإجراء البعيد). تتضمن الأمثلة تقنيات CORBA، وJava - RMI (استدعاء الطريقة عن بعد). ويبدو أن كل شيء على ما يرام فيهم، وخاصة في كوربا، لأن... يمكنك العمل معها بأي لغة برمجة، ولكن لا يزال هناك شيء مفقود. أعتقد أن عيب CORBA هو أنه يعمل من خلال بعض بروتوكولات الشبكة الخاصة به بدلاً من HTTP البسيط، والذي يتناسب مع أي جدار حماية. كانت فكرة خدمة الويب هي إنشاء RPC الذي سيتم إدراجه في حزم HTTP. وهكذا بدأ تطوير المعيار. ما هي المفاهيم الأساسية لهذا المعيار:- صابون . قبل استدعاء إجراء بعيد، تحتاج إلى وصف هذا الاستدعاء في ملف XML بتنسيق SOAP. يعد SOAP ببساطة أحد علامات XML العديدة المستخدمة في خدمات الويب. كل ما نريد إرساله إلى مكان ما عبر HTTP يتم تحويله أولاً إلى وصف XML SOAP، ثم يتم حشوه في حزمة HTTP وإرساله إلى كمبيوتر آخر على الشبكة عبر TCP/IP.
- WSDL . هناك خدمة ويب، أي. برنامج يمكن استدعاء أساليبه عن بعد. لكن المعيار يتطلب أن يكون هذا البرنامج مصحوبًا بوصف يقول "نعم، أنت على حق - إنها حقًا خدمة ويب ويمكنك استدعاء طرق كذا وكذا منها". يتم تمثيل هذا الوصف بملف XML آخر، له تنسيق مختلف، وهو WSDL. أولئك. WSDL هو مجرد ملف XML يصف خدمة ويب وليس أكثر.
النهج العام
في خدمات الويب يوجد دائمًا عميل وخادم. الخادم هو خدمة الويب الخاصة بنا ويسمى أحيانًا نقطة النهاية (كما هو الحال في نقطة النهاية حيث تصل رسائل SOAP من العميل). نحن بحاجة إلى القيام بما يلي:- وصف واجهة خدمة الويب لدينا
- تنفيذ هذه الواجهة
- إطلاق خدمة الويب لدينا
- اكتب عميلاً واتصل عن بعد بطريقة خدمة الويب المطلوبة
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!
إذا لم تراه، فمن المحتمل أنك نسيت تشغيل خدمة الويب.
GO TO FULL VERSION