JavaRush /وبلاگ جاوا /Random-FA /خدمات وب. مرحله 1. وب سرویس چیست و چگونه با آن کار کنیم؟
eGarmin
مرحله

خدمات وب. مرحله 1. وب سرویس چیست و چگونه با آن کار کنیم؟

در گروه منتشر شد
عنوان تاپیک واقعا یک سوال است، زیرا ... من خودم نمی دانم چیست و برای اولین بار سعی می کنم در چارچوب این مقاله با آن کار کنم. تنها چیزی که می توانم تضمین کنم این است که کد ارائه شده در زیر کار خواهد کرد، اما عبارات من فقط فرضیات و حدس هایی در مورد اینکه من چگونه همه اینها را درک می کنم خواهد بود. پس بزن بریم... خدمات وب.  مرحله 1. وب سرویس چیست و چگونه با آن کار کنیم؟  - 1

معرفی

باید با این شروع کنیم که چرا مفهوم وب سرویس ایجاد شد. تا زمانی که این مفهوم در جهان ظاهر شد، فناوری‌هایی وجود داشتند که به برنامه‌ها اجازه می‌داد تا از راه دور تعامل داشته باشند، جایی که یک برنامه می‌توانست روشی را در برنامه دیگری فراخوانی کند، که می‌توان آن را بر روی رایانه‌ای واقع در شهر یا حتی کشور دیگر راه‌اندازی کرد. همه اینها به اختصار RPC (Remote Procedure Calling) نامیده می شود. به عنوان مثال می توان به فناوری های CORBA و برای جاوا - RMI (Remote Method Invoking) اشاره کرد. و به نظر می رسد همه چیز در آنها خوب است، به خصوص در CORBA، زیرا ... شما می توانید با آن در هر زبان برنامه نویسی کار کنید، اما چیزی هنوز گم شده بود. من معتقدم که نقطه ضعف CORBA این است که از طریق برخی از پروتکل های شبکه خود به جای HTTP ساده کار می کند، که از طریق هر دیوار آتشی جا می شود. ایده وب سرویس ایجاد یک RPC بود که در بسته های HTTP درج می شد. بنابراین توسعه استاندارد آغاز شد. مفاهیم اساسی این استاندارد چیست:
  1. صابون . قبل از فراخوانی یک روش راه دور، باید این تماس را در یک فایل XML با فرمت SOAP توصیف کنید. SOAP به سادگی یکی از بسیاری از نشانه گذاری های XML است که در خدمات وب استفاده می شود. هر چیزی که می خواهیم از طریق HTTP به جایی بفرستیم ابتدا به یک توضیحات SOAP XML تبدیل می شود، سپس در یک بسته HTTP قرار می گیرد و از طریق TCP/IP به رایانه دیگری در شبکه ارسال می شود.
  2. WSDL . یک وب سرویس وجود دارد، یعنی. برنامه ای که روش های آن را می توان از راه دور فراخوانی کرد. اما استاندارد ایجاب می‌کند که این برنامه با توضیحی همراه باشد که می‌گوید «بله، درست می‌گویید - این واقعاً یک وب سرویس است و می‌توانید فلان روش را از آن فراخوانی کنید». این توضیحات با یک فایل XML دیگر نشان داده می شود که فرمت متفاوتی دارد، یعنی WSDL. آن ها WSDL فقط یک فایل XML است که یک وب سرویس را توصیف می کند و نه چیزی بیشتر.
چرا اینقدر کوتاه می پرسی؟ نمیشه دقیق تر بگی؟ احتمالاً ممکن است، اما برای انجام این کار باید به کتاب هایی مانند T. Mashnin، "Java Web Services" مراجعه کنید. در آنجا، در 200 صفحه اول، شرح مفصلی از هر برچسب استانداردهای SOAP و WSDL وجود دارد. آیا ارزش انجام دادن دارد؟ به نظر من نه، چون ... همه اینها به طور خودکار در جاوا ایجاد می شود و شما فقط باید محتویات متدهایی را بنویسید که قرار است از راه دور فراخوانی شوند. بنابراین، یک API مانند JAX-RPC در جاوا ظاهر شد. اگر کسی نمی داند، وقتی می گویند جاوا فلان API دارد، به این معنی است که بسته ای با مجموعه ای از کلاس ها وجود دارد که فناوری مورد نظر را در بر می گیرد. JAX-RPC در طول زمان از نسخه ای به نسخه دیگر تکامل یافت و در نهایت به JAX-WS تبدیل شد. بدیهی است که WS مخفف WebService است و ممکن است فکر کنید که این تغییر نام RPC به عنوان یک کلمه رایج این روزها است. این درست نیست، زیرا اکنون وب سرویس ها از ایده اصلی فاصله گرفته اند و به شما امکان می دهند نه تنها با روش های راه دور تماس بگیرید، بلکه به سادگی پیام های سند را در قالب SOAP ارسال کنید. من نمی‌دانم چرا این مورد هنوز لازم است؛ بعید است که پاسخ در اینجا "فقط در صورت نیاز" باشد. من خودم دوست دارم از رفقای با تجربه تر یاد بگیرم. و در آخر، سپس JAX-RS برای خدمات وب به اصطلاح RESTful ظاهر شد، اما این موضوع یک مقاله جداگانه است. مقدمه می تواند در اینجا به پایان برسد، زیرا ... در ادامه کار با JAX-WS را یاد خواهیم گرفت.

رویکرد کلی

در وب سرویس ها همیشه یک کلاینت و یک سرور وجود دارد. سرور سرویس وب ما است و گاهی اوقات نقطه پایانی نامیده می شود (مانند نقطه پایانی که پیام های SOAP از مشتری می رسد). باید موارد زیر را انجام دهیم:
  1. رابط وب سرویس ما را شرح دهید
  2. این رابط را پیاده سازی کنید
  3. وب سرویس ما را راه اندازی کنید
  4. یک کلاینت بنویسید و از راه دور با روش وب سرویس مورد نظر تماس بگیرید
شما می توانید یک وب سرویس را به روش های مختلف راه اندازی کنید: یا یک کلاس را با یک متد توصیف کنید 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ایجاد می کنیم : HelloWebServicePublishermain
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!اگر آن را ندیدید، احتمالاً فراموش کرده اید که وب سرویس را راه اندازی کنید.

نتیجه

این موضوع گشت مختصری در خدمات وب ارائه می کند. یک بار دیگر می گویم که بسیاری از آنچه نوشتم حدس من در مورد نحوه کار است و بنابراین نباید زیاد به من اعتماد کنید. اگر افراد آگاه مرا تصحیح کنند، سپاسگزار خواهم بود، زیرا در این صورت چیزی یاد خواهم گرفت. UPD. بیایید به گفتگو ادامه دهیم
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION