JavaRush /Blog Java /Random-PL /Usługi internetowe. Krok 1. Co to jest usługa internetowa...
eGarmin
Poziom 41

Usługi internetowe. Krok 1. Co to jest usługa internetowa i jak z nią pracować?

Opublikowano w grupie Random-PL
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... Usługi internetowe.  Krok 1. Co to jest usługa internetowa i jak z nią pracować?  - 1

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:
  1. 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.
  2. 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.
Dlaczego pytasz tak krótko? Nie możesz być bardziej szczegółowy? Prawdopodobnie jest to możliwe, ale aby to zrobić, będziesz musiał sięgnąć do książek takich jak T. Mashnin, „Java Web Services”. Tam na pierwszych 200 stronach znajduje się szczegółowy opis każdego znacznika standardów SOAP i WSDL. Czy warto to zrobić? Moim zdaniem nie, bo... wszystko to jest tworzone automatycznie w Javie i wystarczy napisać zawartość metod, które mają być wywoływane zdalnie. Tak więc w Javie pojawił się interfejs API taki jak JAX-RPC. Jeśli ktoś nie wie, to gdy mówią, że Java ma takie a takie API, to znaczy, że istnieje pakiet z zestawem klas, które hermetyzują daną technologię. JAX-RPC ewoluował z biegiem czasu z wersji na wersję i ostatecznie stał się JAX-WS. WS oczywiście oznacza WebService i można by pomyśleć, że jest to po prostu zmiana nazwy RPC jako popularnego obecnie hasła. To nieprawda, ponieważ Teraz usługi sieciowe odeszły od pierwotnego pomysłu i pozwalają nie tylko wywoływać metody zdalne, ale także po prostu wysyłać wiadomości dokumentowe w formacie SOAP. Nie wiem jeszcze, dlaczego jest to potrzebne; jest mało prawdopodobne, że odpowiedź będzie brzmieć „na wszelki wypadek”. Sam chciałbym uczyć się od bardziej doświadczonych towarzyszy. I na koniec pojawił się JAX-RS dla tzw. usług sieciowych RESTful, ale to temat na osobny artykuł. Na tym wstęp można zakończyć, bo... Następnie nauczymy się pracować z JAX-WS.

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:
  1. Opisz interfejs naszego serwisu internetowego
  2. Zaimplementuj ten interfejs
  3. Uruchom nasz serwis internetowy
  4. Napisz klienta i zdalnie wywołaj żądaną metodę usługi internetowej
Możesz uruchomić usługę internetową na różne sposoby: albo opisać klasę za pomocą metody maini 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 interfejs HelloWebService:
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 WebServicei WebMethodnie 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 SOAPBindingjest to adnotacja z parametrami. W tym przypadku używany jest parametr styleo 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ę HelloWebServicePublisherz 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 pakiet ru.javarush.client, a w nim klasę HelloWebServiceClientz 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ą.

Wniosek

W tym temacie odbyła się krótka wycieczka po usługach sieciowych. Jeszcze raz powiem, że duża część tego co napisałem to moje przypuszczenia co do tego jak to działa i dlatego nie powinniście mi zbytnio ufać. Byłbym wdzięczny gdyby kompetentni ludzie mnie poprawili, bo wtedy się czegoś nauczę. UPD. Kontynuujmy rozmowę
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION