JavaRush /Java Blog /Random-TL /Mga serbisyo sa web. Hakbang 2. Paano gawing simple ang p...
eGarmin
Antas

Mga serbisyo sa web. Hakbang 2. Paano gawing simple ang pagsulat ng isang kliyente?

Nai-publish sa grupo
Sa mabilis na tala na ito, gusto kong bisitahin muli ang web service client code na isinulat namin sa nakaraang hakbang . Sa kasong ito, ipagpalagay ko na mayroon kang bukas na IDEA, at sa loob nito ang proyekto mula sa Hakbang 1. Ang aming serbisyo sa web ay dapat ilunsad sa proyektong ito:
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"));
    }
}
Pansinin kung gaano karaming kailangan nating malaman nang maaga. Bilang karagdagan sa katotohanan na kailangan mo ng access sa paglalarawan ng wsdl (kung wala ito, paumanhin, walang paraan):
URL url = new URL("http://localhost:1986/wss/hello?wsdl");
kailangan mong buksan ang xml file na ito sa iyong sarili at tingnan ang tag definitions, at sa loob nito ang mga katangian targetNamespaceat nametawagan ang tagabuo QName:
QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");
pagkatapos ay kailangan mong manu-manong kumonekta sa tag service:
Service service = Service.create(url, qname);
at sa loob nito sa tag port:
HelloWebService hello = service.getPort(HelloWebService.class);
at pagkatapos lamang na maaari naming tawagan ang remote na pamamaraan:
hello.getHelloString("JavaRush")
Спрашивается: для этого наши прадеды гибли на полях сражений, чтобы мы теперь все это делали вручную? А если это даже не наш веб-сервис, а чужой. Тогда этот процесс будет еще неприятней. XML формат создан для чтения machine, а не человеком. Так давайте же заставим машину выполнять грязную работу, а сами насладимся процессом. Для этого нам и делать особо ничего не надо, т.к. в состав нашего любимого SDK, который в Java называется JDK, входит специальная утorта wsimport. Но обо всем по порядку… Для начала давайте создадим новый проект в IDEA, выбрав в меню пункт File > New Project… и дав проекту Name HelloWS. Когда нас спросят, где открыть вновь созданный проект, то нужно ответить New Window, т.е. в новом окне, потому How еще раз замечу, что очень важно, чтобы предыдущий проект был открыт, т.к. мы помним еще с Шага 1, что у нас в том проекте запущен наш веб-сервис. Можно, конечно, его запустить просто через консоль windows, но я этого делать не люблю. Из нового проекта откроем консоль, выбрав View > Tool Windows > Terminal, либо просто нажав Alt+F12. Now мы находимся в корне проекта, а нужно попасть в папку src, поэтому вводим в консоль следующую команду:cd src Теперь настало время воспользоваться утorтой wsimport. Она работает по следующему принципу: мы передаем ей WSDL описание, а она в ответ создает файлы заглушки (так называемые, Stub–классы), которые уже содержат всю необходимую нам функциональность для доступа к веб-сервису. Эти классы разместятся в пакете ru.javarush.ws. Если спросите, откуда берется Name пакета, то отвечу: Name пакета – это развернутое в обратную сторону целевое пространство имен из WSDL описания. Вспоминаем атрибут targetNamespace в теге definitions из WSDL. Там у нас было написано следующее http:// ws.javarush.ru/. И это не address сайта, это так принято в xml описывать пространства имен и если отбросить http:// и развернуть то, что останется, в обратном порядке, то получим наше Name пакета. Итак, запустим утorту: wsimport -keep http://localhost:1986/wss/hello?wsdl Whatбы она сработала нужно, чтобы way to ней был прописан в переменной окружения PATH, либо можно просто использовать полный way to ней. У меня она располагается в папке C:\Program Files\Java\jdk1.8.0_31\bin. Обратите внимание, что все, что нужно сделать – это передать через ключ –keep файл WSDL, который у нас доступен удаленно по ссылке, если мы, конечно, не отключor веб-сервис. What это за классы заглушки? Их всего два. Один из них – это HelloWebService, который по сути является тем же интерфейсом веб-сервиса, который мы создавали вручную на Шаге 1. Difference минимальна и она заключается в том, что немного иначе используются аннотации, с которыми мы уже встречались, а кроме того используются дополнительные аннотации, о которых я ничего не знаю, но раз у нас и без них ранее все работало, то они, очевидно, носят не обязательный характер. Второй класс заглушка – это HelloWebServiceImplService, который наследуется от класса Service. С классом Service мы уже сталкивались в нашем клиенте. Приводить code этого класса не буду, т.к. вряд ли готов пояснить все его строки, но суть класса сводится к тому, что все, что мы ранее писали в клиенте вручную, чтобы подключиться к веб-сервису, в этом классе создано автоматически и нам достаточно вызвать один его метод и все у нас будет в ажуре. Поэтому давайте перепишем code нашего клиента в новом проекте с использованием этих классов и убедимся, что code получается более лаконичным. Для начала в папке 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") );
    }
}
Разбор codeа elementрный и вполне достаточно того, что я описал в комментариях. Запустив клиента, мы должны увидеть строку: Hello, JavaRush Community! При этом клиент из проекта с Шага 1 будет продолжать работать и выводить свой текст, который мы в нем прописали, а именно: Hello, JavaRush! На этом, пожалуй, можно и закончить этот Шаг, т.к. цель его достигнута. Мы поняли, что если есть WSDL описание веб-сервиса, то jdk готово предоставить нам автоматическую генерацию stub-классов-заглушек для упрощения написания клиента к данному веб-сервису. На мой взгляд, это очень полезная возможность на случай, когда хочется потестировать чужой веб-сервис и не залезать глазками в его WSDL описание. Взгляд в будущее В следующей статейке о веб-сервисах я бы хотел изложить идеи, How задеплоить веб-сервис в контейнер сервлетов Tomcat и в разные serverа приложений, чтобы не нужно было запускать веб-сервис, How отдельное приложение, How мы это делали на первых 2-х Шагах. Но перед этим, полагаю, лучше будет сделать небольшое отступление на тему, что такое сервлеты, контейнеры сервлетов и чем они отличаются от serverов приложений и обычных веб-с.... Кроме того, придется сделать краткий обзор serverов приложений, которые, на мой взгляд, заслуживают нашего с вами внимания.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION