JavaRush /Blog Java /Random-PL /Usługi internetowe. Krok 2. Jak uprościć pisanie klienta?...
eGarmin
Poziom 41

Usługi internetowe. Krok 2. Jak uprościć pisanie klienta?

Opublikowano w grupie Random-PL
W tej krótkiej notatce chciałbym ponownie przyjrzeć się kodowi klienta usługi internetowej, który napisaliśmy w poprzednim kroku . W tym przypadku założę, że masz otwartą IDEA, a w niej projekt z Kroku 1. W tym projekcie powinien zostać uruchomiony nasz serwis WWW:
package ru.javarush.client;

// нужно, чтобы получить wsdl описание и через него
// дотянуться до самого веб-сервиса
import java.net.URL;
// такой эксепшн возникнет при работе с obiektом 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, чтобы
        // получить ссылку на удаленный от нас obiekt веб-сервиса
        HelloWebService hello = service.getPort(HelloWebService.class);

        // Ура! Теперь можно вызывать удаленный метод
        System.out.println(hello.getHelloString("JavaRush"));
    }
}
Zwróć uwagę, jak wiele musimy wiedzieć z wyprzedzeniem. Oprócz tego, że potrzebny jest dostęp do opisu wsdl (bez tego niestety nie ma mowy):
URL url = new URL("http://localhost:1986/wss/hello?wsdl");
musisz sam otworzyć ten plik xml i spojrzeć na znacznik definitions, a w nim atrybuty targetNamespacei namewywołać konstruktor QName:
QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");
następnie musisz ręcznie połączyć się z tagiem service:
Service service = Service.create(url, qname);
a w nim do tagu port:
HelloWebService hello = service.getPort(HelloWebService.class);
i dopiero potem możemy wywołać metodę zdalną:
hello.getHelloString("JavaRush")
Pytanie brzmi: czy dlatego nasi pradziadowie ginęli na polach bitew, że teraz robimy to wszystko ręcznie? A jeśli nie jest to nawet nasz serwis internetowy, ale czyjś inny. Wtedy proces ten będzie jeszcze bardziej nieprzyjemny. Format XML jest przeznaczony do odczytu przez maszyny, a nie ludzi. Pozwólmy więc maszynie wykonać brudną robotę i cieszmy się procesem. W tym celu nie musimy robić nic specjalnego, ponieważ... Nasz ulubiony zestaw SDK, zwany w Javie JDK, zawiera specjalne narzędzie o nazwie wsimport . Ale przede wszystkim... Najpierw utwórzmy nowy projekt w IDEA, wybierając z menu Plik > Nowy projekt... i nadając projektowi nazwę HelloWS . Kiedy zostaniemy zapytani, gdzie otworzyć nowo utworzony projekt, musimy odpowiedzieć Nowe Okno , czyli tzw. w nowym oknie, bo jeszcze raz zaznaczę, że bardzo ważne jest, żeby poprzedni projekt był otwarty, bo Pamiętamy z kroku 1, że w tym projekcie mamy uruchomiony nasz serwis internetowy. Możesz oczywiście po prostu uruchomić go za pomocą konsoli Windows, ale ja nie lubię tego robić. Z nowego projektu otwórz konsolę, wybierając Widok > Okna narzędzi > Terminal lub po prostu naciskając Alt+F12 . Jesteśmy teraz w katalogu głównym projektu i musimy dostać się do folderu src , dlatego w konsoli wpisujemy następującą komendę: cd src Teraz czas na skorzystanie z narzędzia wsimport . Działa na zasadzie: przekazujemy mu opis WSDL , a on w odpowiedzi tworzy pliki pośredniczące (tzw. Stub-klasy), które zawierają już wszystkie funkcjonalności potrzebne nam do uzyskania dostępu do serwisu WWW. Zajęcia te zostaną umieszczone w pakiecie ru.javarush.ws. Jeśli zapytasz, skąd pochodzi nazwa pakietu, odpowiedź brzmi: nazwa pakietu to odwrócona docelowa przestrzeń nazw z opisu WSDL . Zapamiętaj atrybut targetNamespacew tagu definitionsz WSDL . Tam mieliśmy napisane co następuje http:// ws.javarush.ru/. I to nie jest adres strony, tak zwyczajowo opisuje się przestrzenie nazw w formacie XML, a jeśli odrzucimy http://i rozwiniemy to, co pozostało w odwrotnej kolejności, otrzymamy nazwę naszego pakietu. Uruchommy więc narzędzie: wsimport -keep http://localhost:1986/wss/hello?wsdl aby zadziałało, ścieżka do niego musi być określona w zmiennej środowiskowej PATH lub możesz po prostu użyć pełnej ścieżki do niego. Dla mnie znajduje się on w folderze C:\Program Files\Java\jdk1.8.0_31\bin . Pamiętaj, że wystarczy przekazać plik WSDL za pomocą klawisza –keep , który jest dostępny zdalnie poprzez link, chyba że oczywiście wyłączyliśmy usługę WWW. Co to za klasy pośrednie? Jest ich tylko dwóch. Jeden z nich jestHelloWebService, czyli w zasadzie ten sam interfejs serwisu WWW, który stworzyliśmy ręcznie w Kroku 1. Różnica jest minimalna i polega na tym, że adnotacje, z którymi się już spotkaliśmy, są wykorzystywane nieco inaczej, a dodatkowo stosowane są dodatkowe adnotacje, które Wspomniałem, że nic nie wiem, ale skoro wcześniej wszystko nam bez nich działało, to oczywiście nie są one obowiązkowe. Druga klasa to stub HelloWebServiceImplService, która dziedziczy po klasie Service. Z klasą spotkaliśmy się już Servicew naszym kliencie. Nie podam kodu tej klasy, bo... Nie jestem jeszcze gotowy, aby wyjaśniać wszystkie jej linie, ale istota klasy sprowadza się do faktu, że wszystko, co wcześniej napisaliśmy w kliencie ręcznie, aby połączyć się z usługą internetową, jest tworzone automatycznie w tej klasie i musimy tylko wywołamy jedną z jego metod i będziemy mieli wszystko ażurowe. Przepiszmy więc kod naszego klienta w nowym projekcie, korzystając z tych klas i upewnijmy się, że kod jest bardziej zwięzły. Najpierw w folderze src nowego projektu utwórzmy pakiet ru.javarush.client, a w nim klasę HelloWebServiceClientz metodą 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") );
    }
}
Parsowanie kodu jest elementarne i to co opisałem w komentarzach w zupełności wystarczy. Po uruchomieniu klienta powinniśmy zobaczyć linię: Hello, JavaRush Community!W tym samym czasie klient z projektu z Kroku 1 będzie kontynuował pracę i wyświetli swój tekst, który w nim napisaliśmy, a mianowicie: Hello, JavaRush! W tym momencie być może uda nam się to zakończyć Krok, ponieważ jego cel został osiągnięty. Zdaliśmy sobie sprawę, że jeśli istnieje opis usługi internetowej w języku WSDL , to jdk jest gotowy zapewnić nam automatyczne generowanie stubklas pośredniczących, aby uprościć pisanie klienta dla tej usługi internetowej. Moim zdaniem jest to bardzo przydatna funkcja, gdy chcesz przetestować cudzą usługę internetową, a nie zaglądać do jej opisu WSDL . Spojrzenie w przyszłość W następnym artykule na temat usług internetowych chciałbym przedstawić pomysły dotyczące wdrażania usługi internetowej w kontenerze serwletów Tomcat i na różnych serwerach aplikacji, tak aby nie było potrzeby uruchamiania usługi internetowej jako osobną aplikację, tak jak to zrobiliśmy w pierwszych 2 krokach. Ale wcześniej myślę, że lepiej byłoby zrobić krótką dygresję na temat tego, czym są serwlety, kontenery serwletów i czym różnią się od serwerów aplikacji i zwykłej sieci... . Ponadto będziemy musieli dokonać krótkiego przeglądu serwerów aplikacji , które moim zdaniem zasługują na naszą uwagę.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION