عنوان تاپیک واقعا یک سوال است، زیرا ... من خودم نمی دانم چیست و برای اولین بار سعی می کنم در چارچوب این مقاله با آن کار کنم. تنها چیزی که می توانم تضمین کنم این است که کد ارائه شده در زیر کار خواهد کرد، اما عبارات من فقط فرضیات و حدس هایی در مورد اینکه من چگونه همه اینها را درک می کنم خواهد بود. پس بزن بریم...
معرفی
باید با این شروع کنیم که چرا مفهوم وب سرویس ایجاد شد. تا زمانی که این مفهوم در جهان ظاهر شد، فناوریهایی وجود داشتند که به برنامهها اجازه میداد تا از راه دور تعامل داشته باشند، جایی که یک برنامه میتوانست روشی را در برنامه دیگری فراخوانی کند، که میتوان آن را بر روی رایانهای واقع در شهر یا حتی کشور دیگر راهاندازی کرد. همه اینها به اختصار RPC (Remote Procedure Calling) نامیده می شود. به عنوان مثال می توان به فناوری های CORBA و برای جاوا - RMI (Remote Method Invoking) اشاره کرد. و به نظر می رسد همه چیز در آنها خوب است، به خصوص در CORBA، زیرا ... شما می توانید با آن در هر زبان برنامه نویسی کار کنید، اما چیزی هنوز گم شده بود. من معتقدم که نقطه ضعف CORBA این است که از طریق برخی از پروتکل های شبکه خود به جای HTTP ساده کار می کند، که از طریق هر دیوار آتشی جا می شود. ایده وب سرویس ایجاد یک RPC بود که در بسته های HTTP درج می شد. بنابراین توسعه استاندارد آغاز شد. مفاهیم اساسی این استاندارد چیست:- صابون . قبل از فراخوانی یک روش راه دور، باید این تماس را در یک فایل XML با فرمت SOAP توصیف کنید. SOAP به سادگی یکی از بسیاری از نشانه گذاری های XML است که در خدمات وب استفاده می شود. هر چیزی که می خواهیم از طریق HTTP به جایی بفرستیم ابتدا به یک توضیحات SOAP XML تبدیل می شود، سپس در یک بسته HTTP قرار می گیرد و از طریق TCP/IP به رایانه دیگری در شبکه ارسال می شود.
- WSDL . یک وب سرویس وجود دارد، یعنی. برنامه ای که روش های آن را می توان از راه دور فراخوانی کرد. اما استاندارد ایجاب میکند که این برنامه با توضیحی همراه باشد که میگوید «بله، درست میگویید - این واقعاً یک وب سرویس است و میتوانید فلان روش را از آن فراخوانی کنید». این توضیحات با یک فایل XML دیگر نشان داده می شود که فرمت متفاوتی دارد، یعنی WSDL. آن ها WSDL فقط یک فایل XML است که یک وب سرویس را توصیف می کند و نه چیزی بیشتر.
رویکرد کلی
در وب سرویس ها همیشه یک کلاینت و یک سرور وجود دارد. سرور سرویس وب ما است و گاهی اوقات نقطه پایانی نامیده می شود (مانند نقطه پایانی که پیام های SOAP از مشتری می رسد). باید موارد زیر را انجام دهیم:- رابط وب سرویس ما را شرح دهید
- این رابط را پیاده سازی کنید
- وب سرویس ما را راه اندازی کنید
- یک کلاینت بنویسید و از راه دور با روش وب سرویس مورد نظر تماس بگیرید
main
و وب سرویس را مستقیماً به عنوان یک سرور راه اندازی کنید، یا آن را در سروری مانند Tomcat یا هر سرور دیگری مستقر کنید. در مورد دوم، ما خودمان سرور جدیدی راهاندازی نمیکنیم و پورت دیگری را روی رایانه باز نمیکنیم، بلکه به کانتینر سرولت تامکت میگوییم که «ما اینجا کلاسهای خدمات وب را نوشتهایم، لطفاً آنها را منتشر کنید تا همه کسانی که با شما تماس میگیرند بتوانند از وب سرویس ما استفاده کنید." صرف نظر از روش راه اندازی وب سرویس، ما همان مشتری را خواهیم داشت.
سرور
بیایید IDEA را راه اندازی کنیم و یک پروژه جدید ایجاد کنیم. پروژه جدید ایجاد کنیم . نام HelloWebService را مشخص کنید و روی دکمه Next و سپس دکمه Finish کلیک کنید . در پوشه 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 یک قرارداد در جاوا است که بر اساس آن پیاده سازی رابط ها به این صورت تعیین شده است (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 + "!";
}
}
بیایید وب سرویس خود را به عنوان یک سرور مستقل راه اندازی کنیم، i.e. بدون مشارکت هیچ تامکت و سرورهای کاربردی (این موضوع برای بحث جداگانه است). برای انجام این کار، در ساختار پروژه در پوشه 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 در رایانه ما (localhost) اجرا می شود، و از طرف دیگر، توضیح WSDL از وب سرویس ما را نشان می دهد. اگر برنامه را متوقف کنید، توضیحات مانند خود وب سرویس در دسترس نخواهد بود، بنابراین ما این کار را انجام نمی دهیم، بلکه به نوشتن مشتری می رویم.
مشتری
در پوشه پروژه srcru.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