Tytuł tematu jest właściwie pytaniem, ponieważ... Sam nie wiem, co to jest i po raz pierwszy spróbuję z tym pracować w ramach tego artykułu. Jedyne, co mogę zagwarantować, to to, że przedstawiony poniżej kod będzie działał, ale moje zwroty będą jedynie założeniami i domysłami na temat tego, jak sam to wszystko rozumiem. Więc chodźmy...
Wstęp
Zacznijmy od tego, dlaczego powstała koncepcja usług sieciowych. Zanim koncepcja ta pojawiła się na świecie, istniały już technologie umożliwiające aplikacjom interakcję na odległość, gdzie jeden program mógł wywołać jakąś metodę w innym programie, który można było uruchomić na komputerze znajdującym się w innym mieście, a nawet kraju. Wszystko to jest określane w skrócie jako RPC (Remote Procedury Calling). Przykładami są technologie CORBA, a w przypadku Javy – RMI (Remote Method Invoking). I wszystko wydaje się być w nich dobre, zwłaszcza w CORBA, bo... Można z nim pracować w dowolnym języku programowania, ale wciąż czegoś brakowało. Uważam, że wadą CORBY jest to, że działa poprzez niektóre własne protokoły sieciowe zamiast prostego HTTP, który przejdzie przez każdą zaporę ogniową. Ideą usługi internetowej było stworzenie RPC, który będzie wstawiany do pakietów HTTP. W ten sposób rozpoczął się rozwój standardu. Jakie są podstawowe pojęcia tego standardu:- MYDŁO . Przed wywołaniem procedury zdalnej należy opisać to wywołanie w pliku XML w formacie SOAP. SOAP to po prostu jeden z wielu znaczników XML używanych w usługach sieciowych. Wszystko, co chcemy wysłać gdzieś za pośrednictwem protokołu HTTP, jest najpierw konwertowane na opis XML SOAP, następnie umieszczane w pakiecie HTTP i wysyłane do innego komputera w sieci za pośrednictwem protokołu TCP/IP.
- WSDL . Istnieje serwis internetowy, tj. program, którego metody można wywoływać zdalnie. Ale standard wymaga, aby temu programowi towarzyszył opis mówiący: „tak, masz rację - to naprawdę jest usługa internetowa i możesz z niej wywoływać takie a takie metody”. Opis ten jest reprezentowany przez inny plik XML, który ma inny format, a mianowicie WSDL. Te. WSDL to po prostu plik XML opisujący usługę internetową i nic więcej.
Ogólne podejście
W usługach internetowych zawsze jest klient i serwer. Serwer jest naszą usługą internetową i czasami nazywany jest punktem końcowym (np. punktem końcowym, do którego docierają komunikaty SOAP od klienta). Musimy wykonać następujące czynności:- Opisz interfejs naszego serwisu internetowego
- Zaimplementuj ten interfejs
- Uruchom nasz serwis internetowy
- Napisz klienta i zdalnie wywołaj żądaną metodę usługi internetowej
main
i uruchomić usługę internetową bezpośrednio jako serwer, albo wdrożyć ją na serwerze takim jak Tomcat lub inny. W drugim przypadku sami nie uruchamiamy nowego serwera i nie otwieramy kolejnego portu na komputerze, a po prostu przekazujemy kontenerowi serwletu Tomcat, że „napisaliśmy tutaj klasy usług sieciowych, proszę je opublikować, aby każdy, kto się z Państwem skontaktuje, mógł skorzystaj z naszego serwisu internetowego." Niezależnie od sposobu uruchomienia serwisu WWW, będziemy mieli tego samego klienta.
serwer
Uruchommy IDEA i utwórzmy nowy projekt. Utwórz nowy projekt . Podaj nazwę HelloWebService i kliknij przycisk Dalej , a następnie przycisk Zakończ . W folderze src utworzymy pakiet ru.javarush.ws . W tym pakiecie utworzymy interfejsHelloWebService
:
package ru.javarush.ws;
// это аннотации, т.е. способ отметить наши классы и методы,
// Jak связанные с веб-сервисной технологией
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
// говорим, что наш интерфейс будет работать Jak веб-сервис
@WebService
// говорим, что веб-сервис будет использоваться для вызова методов
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface HelloWebService {
// говорим, что этот метод можно вызывать удаленно
@WebMethod
public String getHelloString(String name);
}
W tym kodzie klasy są tzw. adnotacjami WebService
i WebMethod
nie robią nic poza oznaczeniem naszego interfejsu i jego metody jako usługi internetowej. To samo tyczy się klasy SOAPBinding
. Jedyna różnica polega na tym, że SOAPBinding
jest to adnotacja z parametrami. W tym przypadku używany jest parametr style
o wartości wskazującej, że serwis WWW będzie działał nie poprzez komunikaty dokumentowe, ale jak klasyczny RPC, tj. wywołać metodę. Zaimplementujmy naszą logikę interfejsu i utwórzmy klasę w naszym pakiecie HelloWebServiceImpl
. Przy okazji dodam, że kończenie klasy za pomocą Impl to konwencja w Javie, zgodnie z którą tak określa się implementację interfejsów (Impl – od słowa implementacja, czyli implementacja). Nie jest to wymóg i możesz nazwać klasę jak chcesz, ale wymagają tego dobre maniery:
package ru.javarush.ws;
// таже adnotacja, что и при описании интерфейса,
import javax.jws.WebService;
// но здесь используется с параметром endpointInterface,
// указывающим полное Nazwa класса интерфейса нашего веб-сервиса
@WebService(endpointInterface = "ru.javarush.ws.HelloWebService")
public class HelloWebServiceImpl implements HelloWebService {
@Override
public String getHelloString(String name) {
// просто возвращаем приветствие
return "Hello, " + name + "!";
}
}
Uruchommy nasz serwis WWW jako niezależny serwer tj. bez udziału jakichkolwiek serwerów Tomcat i aplikacji (to temat na osobną dyskusję). W tym celu w strukturze projektu w folderze src utworzymy pakiet ru.javarush.endpoint
, a w nim utworzymy klasę HelloWebServicePublisher
z metodą main
:
package ru.javarush.endpoint;
// класс, для запуска веб-serwerа с веб-сервисами
import javax.xml.ws.Endpoint;
// класс нашего веб-сервиса
import ru.javarush.ws.HelloWebServiceImpl;
public class HelloWebServicePublisher {
public static void main(String... args) {
// запускаем веб-serwer на порту 1986
// и по adresу, указанному в первом аргументе,
// запускаем веб-сервис, передаваемый во втором аргументе
Endpoint.publish("http://localhost:1986/wss/hello", new HelloWebServiceImpl());
}
}
Teraz uruchommy tę klasę, naciskając Shift+F10 . Nic nie pojawi się w konsoli, ale serwer działa. Możesz to sprawdzić wpisując w przeglądarce wiersz http://localhost:1986/wss/hello?wsdl . Strona, która się otworzy, z jednej strony dowodzi, że na naszym komputerze (localhost) mamy serwer WWW (http://) działający na porcie 1986 (localhost), a z drugiej strony pokazuje opis naszego serwisu WWW w formacie WSDL. Jeśli zatrzymasz aplikację, opis stanie się niedostępny, podobnie jak sam serwis, dlatego nie będziemy tego robić, tylko przejdziemy do pisania klienta.
Klient
W folderze projektu src utworzymy pakietru.javarush.client
, a w nim klasę HelloWebServiceClient
z metodą main
:
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"));
}
}
Dałem maksymalną liczbę komentarzy na temat kodu w aukcji. Nie mam nic do dodania, więc uciekamy (Shift+F10). Powinniśmy zobaczyć tekst w konsoli: Hello, JavaRush!
Jeśli go nie widziałeś, prawdopodobnie zapomniałeś uruchomić usługę internetową.
GO TO FULL VERSION