background image

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/

background image

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

background image

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

background image

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

background image

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

background image

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)

background image

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

background image

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

background image

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()

background image

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

background image

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

background image

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

background image

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

background image

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)

background image

257

Architektura Apache SOAP

klient

serwer

SOAP

klasa 

Java

org.apache.soap

org.apache.soap.rpc

serwer WWW

HTTP

XML

XML

XML

XML

background image

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

background image

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();

...

background image

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.

background image

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>

background image

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

background image

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

background image

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

background image

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

background image

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

background image

267

Utworzenie usługi sieciowej

background image

268

Wybór klasy źródłowej

background image

269

Wybór metod dostępnych w usłudze

background image

270

Wybór konfiguracji WSDL

background image

271

Wygenerowanie klasy klienta proxy

background image

272

Wybór parametrów klienta proxy

background image

273

Wybór metod dla których zostaną 

wygenerowane wrappery

background image

274

Instalacja usługi sieciowej

background image

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