JavaRush /وبلاگ جاوا /Random-FA /خدمات وب. مرحله 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);
و تنها پس از آن می توانیم متد remote را فراخوانی کنیم:
hello.getHelloString("JavaRush")
سؤال این است: آیا به همین دلیل است که پدربزرگ‌های ما در جبهه‌های جنگ جان باختند، به طوری که ما اکنون همه این کارها را با دست انجام می‌دهیم؟ و اگر حتی سرویس وب ما نباشد، بلکه متعلق به شخص دیگری باشد. سپس این روند حتی ناخوشایندتر خواهد بود. فرمت XML برای خواندن توسط ماشین ها طراحی شده است نه انسان. بنابراین اجازه دهید دستگاه کار کثیف را انجام دهد و از این روند لذت ببرید. برای این کار نیازی به انجام کار خاصی نداریم، زیرا ... SDK مورد علاقه ما، به نام JDK در جاوا، شامل یک ابزار ویژه به نام wsimport است . اما اول از همه... ابتدا بیایید با انتخاب File > New Project... از منو و دادن نام HelloWS به پروژه، یک پروژه جدید در IDEA ایجاد کنیم . وقتی از ما پرسیده می شود که پروژه جدید ایجاد شده را کجا باز کنیم، باید به New Window پاسخ دهیم ، یعنی. در یک پنجره جدید، زیرا یک بار دیگر متذکر می شوم که بسیار مهم است که پروژه قبلی باز باشد، زیرا از مرحله 1 به یاد می آوریم که وب سرویس ما در آن پروژه اجرا می شود. البته می توانید آن را به سادگی از طریق کنسول ویندوز راه اندازی کنید، اما من دوست ندارم این کار را انجام دهم. از پروژه جدید، کنسول را با انتخاب View > Tool Windows > Terminal یا به سادگی فشار دادن Alt+F12 باز کنید . اکنون در ریشه پروژه هستیم و باید وارد پوشه src شویم ، بنابراین دستور زیر را در کنسول وارد می کنیم: cd src اکنون زمان استفاده از ابزار wsimport است . این بر اساس اصل زیر کار می کند: ما یک توضیحات WSDL برای آن ارسال می کنیم ، و در پاسخ، فایل های خرد (به اصطلاح Stub-classes) را ایجاد می کند، که از قبل شامل تمام عملکردهای مورد نیاز برای دسترسی به وب سرویس است. این کلاس ها در بسته قرار می گیرند ru.javarush.ws. اگر بپرسید نام بسته از کجا آمده است، پاسخ این است: نام بسته فضای نام هدف معکوس از توضیحات WSDL است . ویژگی موجود در targetNamespaceتگ WSDL را به خاطر بسپارید . در آنجا ما نوشته های زیر را داشتیم . و این آدرس سایت نیست، مرسوم است که فضاهای نام را در xml توصیف کنیم، و اگر آنچه باقی مانده را به ترتیب معکوس کنار بگذاریم و گسترش دهیم، نام بسته خود را دریافت خواهیم کرد. بنابراین، بیایید ابزار را اجرا کنیم: برای کارکرد آن، مسیر رسیدن به آن باید در متغیر محیطی PATH مشخص شود ، یا می‌توانید به سادگی از مسیر کامل آن استفاده کنید. برای من در پوشه C:\Program Files\Java\jdk1.8.0_31\bin قرار دارد . لطفاً توجه داشته باشید که تنها کاری که باید انجام دهید این است که فایل WSDL را از طریق کلید –keep ارسال کنید که از راه دور از طریق یک پیوند در دسترس است، مگر اینکه، البته، ما سرویس وب را غیرفعال کرده باشیم. این کلاس های خرد چیست؟ فقط دو نفر از آنها وجود دارد. یکی از آنها استdefinitionshttp:// ws.javarush.ru/http://wsimport -keep http://localhost:1986/wss/hello?wsdlHelloWebService، که در اصل همان رابط وب سرویس است که در مرحله 1 به صورت دستی ایجاد کردیم. تفاوت بسیار کم است و در این واقعیت نهفته است که حاشیه نویسی هایی که قبلاً با آنها روبرو شده ایم کمی متفاوت استفاده می شوند و علاوه بر این از حاشیه نویسی های اضافی نیز استفاده می شود. من اشاره کردم که من چیزی نمی دانم، اما از آنجایی که قبلاً همه چیز برای ما بدون آنها کار می کرد، پس واضح است که آنها اجباری نیستند. کلاس دوم stub است HelloWebServiceImplServiceکه از کلاس ارث می برد Service. ما قبلاً با کلاس Serviceدر مشتری خود مواجه شده ایم. من کد این کلاس را نمی دهم، زیرا ... من به سختی آماده توضیح همه خطوط آن هستم، اما ماهیت کلاس به این برمی گردد که همه چیزهایی که قبلاً در کلاینت به صورت دستی برای اتصال به وب سرویس نوشتیم به طور خودکار در این کلاس ایجاد می شود و فقط باید یکی از روش های آن را فراخوانی کنید و ما همه چیز را در openwork خواهیم داشت. بنابراین بیایید با استفاده از این کلاس‌ها، کد مشتری خود را در یک پروژه جدید بازنویسی کنیم و مطمئن شویم که کد مختصرتر است. ابتدا در پوشه 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 آن نگاه نکنید. نگاهی به آینده در مقاله بعدی در مورد وب سرویس‌ها، می‌خواهم ایده‌هایی را در مورد نحوه استقرار یک وب سرویس در یک کانتینر سرولت تامکت و در سرورهای برنامه مختلف بیان کنم، به طوری که نیازی به اجرای وب سرویس به عنوان یک برنامه جداگانه، همانطور که در 2 مرحله اول انجام دادیم. اما قبل از آن به نظر من بهتر است یک انحراف کوتاه در این موضوع انجام دهیم که سرولت ها، کانتینرهای سرولت چیست و چه تفاوتی با سرورهای اپلیکیشن و وب معمولی دارند... . علاوه بر این، ما باید مروری کوتاه بر سرورهای برنامه داشته باشیم که به نظر من شایسته توجه ما هستند.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION