243 Dostęp do komponentów EJB przez usługi Web Services Mikołaj Morzy Mikolaj.Morzy@cs.put.poznan.pl http://www.cs.put.poznan.pl/mmorzy/
Plan rozdziału 244 Wprowadzenie do usług sieciowych Architektura SOAP Web Services Definition Language Rejestr UDDI Zastosowanie Oracle JDeveloper do tworzenia usług sieciowych
Architektura zorientowana na usługi 245 opublikuj dostawca usługi rejestr usług wywołaj znajdź klient usługi Usługa sieciowa (Web Service) to technologia budowania rozproszonych, komunikujących się ze sobą aplikacji Usługi sieciowe samodzielnie się opisują są zorientowane na świadczenie usług są oparte o standardy (HTTP, SMTP, XML, SOAP, WSDL, UDDI) opisują komunikację między aplikacjami są niezależne od platformy i języka implementacji
Elementy usług sieciowych 246 Komunikacja: podstawą funkcjonowania usług sieciowych są tradycyjne protokoły internetowe (HTTP, FTP) za pomocą których usługi sieciowe komunikują się ze sobą Uniwersalny format danych: usługi sieciowe korzystają z XML w celu wymiany danych oraz w celu opisu funkcjonalności poszczególnych usług Simple Object Access Protocol: usługi sieciowe wykorzystują protokół SOAP do wymiany komunikatów XML. Protokół SOAP funkcjonuje jako wrapper dla komunikatów XML, zamykając je w tzw. kopertach
Elementy usług sieciowych 247 Web Services Description Language: dokumenty WSDL to samoopisujące się specyfikacje prezentujące funkcjonalność danej usługi. Dokumenty WSDL są zgodne z XML i zawierają informację w jaki sposób należy korzystać z danej usługi sieciowej Universal Description, Discovery and Integration: rejestry usług UDDI przechowują dokumenty WSDL opisujące usługi. Rejestry te są przeszukiwane w celu zlokalizowania odpowiedniej usługi. Rejestry UDDI są wykorzystywane przez dostawców usług do publikowania usług
Zalety korzystania z usług sieciowych 248 Rozproszony model komponentów Wykorzystanie XML do reprezentacji i przesyłania danych Pełna niezależność od języka implementacji Łatwość dostępu przy pomocy standardowych protokołów, takich jak HTTP, FTP, SMTP Oszczędność czasu, istniejące komponenty mogą być bardzo łatwo udostępnione jako usługi sieciowe Różne sposoby wykorzystania komunikacja synchroniczna (RPC) komunikacja asynchroniczna (przesyłanie komunikatów)
Ogólny model usług sieciowych 249 aplikacja klienta inerfejs XML (WSDL) 2 3 rejestr usług (UDDI) interfejs XML (WSDL) usługa sieciowa 1
Protokół SOAP 250 SOAP to prosty protokół oparty na XML który pozwala na wymianę danych z wykorzystaniem protokołu HTTP oraz na implementowanie usług sieciowych SOAP jest przenośnym protokołem, aplikacje korzystające z SOAP mogą być napisane w różnych językach i mogą być wykonywane na różnych platformach Komunikacja między aplikacjami wykorzystującymi SOAP odbywa się poprzez zdalne wołanie procedur (RPC Remote Procedure Call) wymianę komunikatów
Architektura SOAP 251 klient SOAP serwer SOAP usługa SOAP metoda() wynik wynik metoda() konwersja odczytanie konwersja odczytanie XML XML HTTP XML XML Wywołanie metody przez klienta jest konwertowane do dokumentu XML, parametry wywołania są konwertowane do postaci binarnej i dokument XML jest wysyłany za pomocą protokołu HTTP do usługi sieciowej. Metoda sieciowa zwraca wynik działania w analogiczny sposób.
Koperta SOAP 252 Koperta SOAP to poprawny dokument XML który zawiera następujące elementy <Envelope></Envelope> wyznacza początek i koniec koperty <Header></Header> wyznacza początek i koniec nagłówka koperty, w nagłówku umieszczane są informacje specyficzne dla aplikacji, np. routing, cache, szyfrowanie, podpisy cyfrowe <Body></Body> wyznacza początek i koniec ciała koperty, w ciele zawarte są dane wywołania usługi (np. nazwy i wartości parametrów) jak i wyniki działania usługi <Fault></Fault> wyznacza początek i koniec bloku opisującego błędy powstałe podczas przetwarzania
Przykład koperty SOAP 253 Wywołanie metody float dodaj(float x, float y) z wartościami 10 i 20 POST /dodaj HTTP/1.1 Content-Type: text/xml; charset=utf-8 Content-Length: xxx SOAPAction "http://miner.cs.put.poznan.pl/kalkulator" <?xml version="1.0"?> <soap:envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingstyle="http://www.w3.org/2001/12/soap-encoding"> <soap:body> <m:dodaj xmlns:m="http://miner.cs.put.poznan.pl/kalkulator"> <m:val1>10</m:val1> <m:val2>20</m:val2> </m:dodaj> </soap:body> </soap:envelope>
Przykład koperty SOAP 254 Wynik metody float dodaj(float x, float y) z wartościami 10 i 20 HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: xxx <?xml version="1.0"?> <soap:envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingstyle="http://www.w3.org/2001/12/soap-encoding"> <soap:body> <m:dodajresponse xmlns:m="http://miner.cs.put.poznan.pl/kalkulator"> <m:dodajresult>30</m:dodajresult> </m:dodajresponse> </soap:body> </soap:envelope>
Przykład koperty SOAP 255 Wynik metody float dodaj(float x, float y), pojawił się niespodziewany błąd HTTP/1.1 500 Server Error Connection: close Content-Type: text/xml; charset=utf-8 Content-Length: xxx Date: 01 Feb 2004 04:02:23 GMT <?xml version="1.0"?> <soap:envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingstyle="http://www.w3.org/2001/12/soap-encoding"> <soap:body> <soap:fault xmlns:m="http://miner.cs.put.poznan.pl/kalkulator"> <faultcode>soap:client</faultcode> <faultstring>podano zbyt wiele parametrów</faultstring> </soap:fault> </soap:body> </soap:envelope>
Implementacja 256 Protokół SOAP jest niezależny od języka implementacji, proces kodowania (serializacji) żądania i wyniku działania usługi, jak i proces komunikacji przez protokół HTTP może być przeprowadzony w dowolnym języku programowania. Wiele języków udostępnia wygodne biblioteki Java SOAP for Apache Java GLUE Perl SOAP::Lite C/C++ gsoap Microsoft SOAP (część platformy.net)
Architektura Apache SOAP 257 klient serwer SOAP klasa Java org.apache.soap org.apache.soap.rpc serwer WWW XML XML HTTP XML XML
Ręczna implementacja usługi 258 Kod usługi public class Kalkulator { public float dodaj(float x, float y) { return x+y; } } Deskryptor instalacji <isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment" id="urn:mojkalkulator"> <isd:provider type="java" scope="application" methods="dodaj"> <isd:java class="kalkulator" static="false"/> </isd:provider> </isd:service> Instalacja usługi java org.apache.server.servicemanagerclient \ http://miner.cs.put.poznan.pl/apache-soap/servlet/rpcrouter \ deploy deployment_descriptor.xml
Ręczna implementacja usługi 259 import java.net.url; import java.util.vector; import org.apache.soap.*; import org.apache.soap.rpc.*;... Call call = new Call(); call.settargetobjecturi("urn:mojkalkulator"); call.setmethodname("dodaj"); call.setencodingstyleuri(constants.ns_uri_soap_enc); Vector parameters = new Vector(); parameters.addelement(new Parameter("val1", Float.class, 10, null)); parameters.addelement(new Parameter("val2", Float.class, 20, null)); call.setparams(parameters); Response response = call.invoke(new URL("http://miner/apache-soap/servlet/rpcrouter"), ""); Parameter returnvalue = response.getreturnvalue(); Object value = returnvalue.getvalue();...
Web Services Description Language 260 Wołając daną usługę programista musi zaszyć w kodzie lokalizację usługi, nazwę metody, liczbę i typy parametrów. WSDL to oparty o XML język opisu usługi, dokument WSDL zawiera wszystkie informacje potrzebne do wywołania usługi (lokalizacja, nazwa, parametry). WSDL jest tworzony przez dostawcę usługi i publikowany, programiści mogą ściągnąć opis usługi i wykorzystać go do wywołania danej usługi. Dokumenty WSDL mogą być automatycznie przetłumaczone na język programowania wykorzystywany przez programistę (za pomocą Client Proxy), tłumaczenie może też odbywać się w momencie wywoływania usługi.
Przykład pliku WSDL <?xml version = '1.0' encoding = 'UTF-8'?> <definitions name="lookupemp" targetnamespace="http://webservice/lookupemp.wsdl" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://webservice/lookupemp.wsdl" xmlns:ns1="http://webservice/webservice.xsd"> <message name="dodaj0request"> <part name="x" type="xsd:float"/><part name="y" type="xsd:float"/> </message> <message name="dodaj0response"> <part name="return" type="xsd:float"/> </message> <porttype name="webserviceporttype"> <operation name="dodaj"> <input name="dodaj0request" message="tns:dodaj0request"/> <output name="dodaj0response" message="tns:dodaj0response"/> </operation> </porttype> <binding name="webservicebinding" type="tns:webserviceporttype"> <soap:binding style="rpc"/> <operation name="dodaj"> <input name="dodaj0request"><soap:body use="encoded" namespace="kalkulator"/></input> <output name="dodaj0response"><soap:body use="encoded" namespace="kalkulator"/></output> </operation> </binding> <service name="kalkulator"> <port name="webserviceport" binding="tns:webservicebinding"> <soap:address location="http://miner.cs.put.poznan.pl/kalkulator"/> </port> </service> </definitions> 261
Automatyczna translacja dokumentów WSDL przez Client Proxy 262 Dokument WSDL oracle.wsdl.toolkit.proxygenerator Client Proxy Utworzony przez dostawcę usługi dokument WSDL jest pobierany przez programistę/klienta. Klient tłumaczy dokument WSDL na język, w którym tworzona jest aplikacja łącząca się z usługą sieciową.
Rejestr UDDI 263 UDDI to specyfikacja bazy danych, w których dostawcy usług rejestrują swoje usługi przy pomocy dokumentów WSDL white pages: adres, dostawca, informacja kontaktowa yellow pages: wyszukiwanie wg typu, lokalizacji, kategorii i innych green pages: informacje techniczne, interfejs, URL, itp. Rejestr UDDI jest wykorzystywany do odczytania dokumentu WSDL i przesłania go do klienta w celu wygenerowania kodu łączącego się z usługą Dostępne obecnie usługi sieciowe oferują bardzo szeroki zakres świadczeń, m.in. prognozy pogody, wymiana walut, wyszukiwarki, sklepy internetowe, i wiele innych
REST 264 Podejście REST (Representational State Transfer): krytyka technologii usług sieciowych tradycyjne techniki i metody HTTP (POST,GET,PUT,DELETE) w zupełności wystarczające unikalny URL reprezentuje komponent usług sieciowych a nie konkretną usługę, przez co trudniej buforować wyniki bezpośrednia dostępność usług ułatwia ich integrację konieczność uczenia się nowych narzędzi i technik
Podsumowanie 265 wyszukanie usługi WSDL WSDL XML UDDI XML Java Client Proxy aplikacja klienta Java wywołanie usługi wyniki usługa SOAP
Kalkulator.java public class Kalkulator { public Kalkulator() {} Klasa Java 266 public float dodaj(float x, float y) { return x+y; } public double odejmij(double x, double y) { return x - y; } public double pomnoz(double x, double y) { return x * y; } } public double podziel(double x, double y) { return x / y; } IKalkulator.java public interface IKalkulator { public double dodaj(double x, double y); public double odejmij(double x, double y); public double pomnoz(double x, double y); public double podziel(double x, double y); }
Utworzenie usługi sieciowej 267
Wybór klasy źródłowej 268
Wybór metod dostępnych w usłudze 269
Wybór konfiguracji WSDL 270
Wygenerowanie klasy klienta proxy 271
Wybór parametrów klienta proxy 272
Wybór metod dla których zostaną wygenerowane wrappery 273
Instalacja usługi sieciowej 274
Fragment przykładowego klienta 275 KalkulatorWebServiceStub.java... public class KalkulatorWebServiceStub { public KalkulatorWebServiceStub() { m_httpconnection = new OracleSOAPHTTPConnection(); m_smr = new SOAPMappingRegistry(); } } public static void main(string[] args) { try { KalkulatorWebServiceStub stub = new KalkulatorWebServiceStub(); Double x = new Double(10); Double y = new Double(20); Double result = stub.podziel(x,y); System.out.println(result); } catch(exception ex) { ex.printstacktrace(); }