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/
244
Plan rozdziału
• Wprowadzenie do usług sieciowych
• Architektura SOAP
• Web Services Definition Language
• Rejestr UDDI
• Zastosowanie Oracle JDeveloper do tworzenia usług
sieciowych
245
Architektura zorientowana na 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
dostawca
usługi
klient usługi
rejestr usług
opublikuj
znajdź
wywołaj
246
Elementy usług sieciowych
• 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
247
Elementy usług sieciowych
• 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
248
Zalety korzystania z usług sieciowych
• 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)
249
Ogólny model usług sieciowych
aplikacja klienta
rejestr usług
(UDDI)
usługa
sieciowa
inerfejs XML (WSDL)
interfejs XML (WSDL)
1
2
3
250
Protokół SOAP
• 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
251
Architektura SOAP
• 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.
klient
SOAP
serwer
SOAP
usługa
SOAP
konwersja
odczytanie
konwersja
odczytanie
HTTP
XML
XML
XML
XML
wynik
wynik
metoda()
metoda()
252
Koperta SOAP
• 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
253
Przykład koperty SOAP
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>
Wywołanie metody
float dodaj(float x, float y)
z wartościami 10 i 20
254
Przykład koperty SOAP
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>
Wynik metody
float dodaj(float x, float y)
z wartościami 10 i 20
255
Przykład koperty SOAP
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>
Wynik metody
float dodaj(float x, float y)
, pojawił się niespodziewany błąd
256
Implementacja
• 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)
257
Architektura Apache SOAP
klient
serwer
SOAP
klasa
Java
org.apache.soap
org.apache.soap.rpc
serwer WWW
HTTP
XML
XML
XML
XML
258
Ręczna implementacja usługi
public class Kalkulator {
public float dodaj(float x, float y) { return x+y; }
}
Kod usługi
<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>
Deskryptor instalacji
java org.apache.server.ServiceManagerClient \
http://miner.cs.put.poznan.pl/apache-soap/servlet/rpcrouter \
deploy deployment_descriptor.xml
Instalacja usługi
259
Ręczna implementacja usługi
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();
...
260
Web Services Description Language
• 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.
261
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>
262
Automatyczna translacja dokumentów
WSDL przez 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ą.
Dokument WSDL
Client Proxy
oracle.wsdl.toolkit.ProxyGenerator
263
Rejestr UDDI
• 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
264
REST
• 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
265
Podsumowanie
UDDI
XML
XML
Java
Client
Proxy
usługa
SOAP
usługa
SOAP
Java
wyszukanie usługi
WSDL
WSDL
aplikacja klienta
wywołanie usługi
wyniki
266
Klasa Java
public class Kalkulator {
public Kalkulator() {}
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; }
}
Kalkulator.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);
}
IKalkulator.java
267
Utworzenie usługi sieciowej
268
Wybór klasy źródłowej
269
Wybór metod dostępnych w usłudze
270
Wybór konfiguracji WSDL
271
Wygenerowanie klasy klienta proxy
272
Wybór parametrów klienta proxy
273
Wybór metod dla których zostaną
wygenerowane wrappery
274
Instalacja usługi sieciowej
275
Fragment przykładowego klienta
....
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(); }
}
KalkulatorWebServiceStub.java