SOAP, WSDL

Transcrição

SOAP, WSDL
Web Services und SOAP
XML
XML
Einführung
■ Sie wissen, was ein Web Service ist
■ Sie wissen, was SOAP ist
■ Sie wissen, wie eine SOAP Meldung aufgebaut ist
■ Sie können SOAP Meldungen mittels WSDL beschreiben
■ Sie können einen SOAP Web Service Klient und Server
implementieren
School of Engineering
© K. Rege, ZHAW
1 von 64
Früher
School of Engineering
© K. Rege, ZHAW
2 von 64
Heute
?
■ Kunde sucht sich auf dem
Internet die Hotel, Flug und
Mietwagenfirmen-Seiten
Fluggesellschaft
FluggesellschaftWS
WS
Schifffahrtslinie
SchifffahrtslinieWS
WS
html
■ Stellt sich ein passendes Angebot
zusammen
Credit
CreditCard
CardWS
WS
?
Kunde
Kunde
l
htm
Virtuelles
VirtuellesReisebüro
Reisebüro
Bahn
BahnWS
WS
?
Hotel
HotelWS
WS
Kunde
Kunde
?
html
Mietwagen
Mietwagen WS
WS
htm
l
■ Es braucht eine standardisierte, maschinell verarbeitbare Kommunikation
zwischen Reisebüro und Dienstleistungsanbietern
School of Engineering
© K. Rege, ZHAW
3 von 64
School of Engineering
© K. Rege, ZHAW
4 von 64
Definition Web-Service (nach W3C)
(Web) Service Architektur
- -Verwaltet
VerwaltetServîce
ServîceVerzeichnis
Verzeichnis
■ Ein Web-Service ist folgendermassen definiert
- -Ermöglicht
Ermöglichtdas
dasEintragen
Eintragenvon
vonServices
Services
Fi
nd
e
Binde
Service
ServiceKonsument
Konsument
■ Zweck ist Interoperation zwischen Maschinen
■ Schnittstelle beschrieben in maschinenlesbarer Form (WSDL)
■ Nachrichtenaustausch über SOAP Meldungen
■ meist via HTTP oder anderen Web Protokollen
■ Web Service
■ meist unter Verwendung von in XML kodierten Nachrichten
■
■
5 von 64
School of Engineering
■ SOAP
■ Vorteile
■
■
■
■
■
■
Service
Service
Beschreibung
Beschreibung
"Vertrag"
"Vertrag"
Ein Web Service ist eine Funktion (Prozedur,Methode, Teil der Geschäftslogik), die via InternetTechnologien zugegriffen werden kann
Daten werden meist in XML-Format übermittelt
Vor- und Nachteile
XML-Standard für Nachrichtenaustausch
unabhängig von Transportprotokoll
unabhängig von Client- und Service-Implementierung: Java, .NET, PHP, …
Service
ServiceAnbieter
Anbieter
- Konsumiert Dienste des Anbieters
- Konsumiert Dienste des Anbieters
- Sucht den gewünschten Dienst im
- Sucht den gewünschten Dienst im
Verzeichnis
Verzeichnis
- Stellt Verbindung mit dem
- Stellt Verbindung mit dem
Dienstanbieter her und nimmt Dienst
Dienstanbieter her und nimmt Dienst
in Anspruch
in Anspruch
Web Services
■
- -Beschreibt
Beschreibtdie
dieangebotenen
angebotenenDienste
Dienste
wie
wiesind
sinddie
dieDienste
Diensteabrufbar?
abrufbar?
(Dienstleistungs-)Vertragsinhalt
(Dienstleistungs-)Vertragsinhalt
- Publiziert Dienste in Verzeichnis
- Publiziert Dienste in Verzeichnis
Beschreibt
BeschreibtDienste
Diensteso,
so,dass
dassKunden
Kunden
den
denDienstanbieter
Dienstanbieterfinden
findenkönnen
können
e
http://www.w3.org/TR/ws-gloss/
http://www.w3.org/TR/ws-gloss/
© K. Rege, ZHAW
Service
ServiceVerzeichnis
Verzeichnis
r
zie
bli
Pu
AAWeb
Webservice
serviceisisaasoftware
softwaresystem
systemdesigned
designedtotosupEndPoint
supEndPoint
interoperable
interoperablemachine-to-machine
machine-to-machineinteraction
interactionover
overaanetwork.
network.
ItIthas
an
interface
described
in
a
machine-processable
has an interface described in a machine-processableformat
format
(specifically
WSDL).
Other
systems
interact
with
the
Web
(specifically WSDL). Other systems interact with the Web
service
serviceininaamanner
mannerprescribed
prescribedby
byitsitsdescription
descriptionusing
usingSOAPSOAPmessages,
messages,typically
typicallyconveyed
conveyedusing
usingHTTP
HTTPwith
withan
anXML
XML
serialization
serializationininconjunction
conjunctionwith
withother
otherWeb-related
Web-relatedstandards.
standards.
School of Engineering
- -Bietet
BietetDienste
Dienstean:
an:
Teil
Teilder
derGeschäftslogik
Geschäftslogik
- -Ermöglicht
Ermöglichtdas
dasFinden
Findenvon
vonService
Service
Anbieter
AnbieterAdressen
Adressenanhand
anhand
unterschiedlicher
unterschiedlicherKriterien
Kriterien
© K. Rege, ZHAW
6 von 64
unabhängig von Programmiersprache, Laufzeitumgebung und Betriebssystem
baut auf bestehender Internet-Infrastruktur auf
standardisiert
von den grossen unterstützt/vorangetrieben (ABM und Microsoft)
■ Web Services Description Language - WSDL
■
Schnittstellen-Beschreibung in XML
■ Nachteile
■
■ Kommunikation auf Basis existierenden Protokolle und Serverarchitekturen
■
■
■
■
HTTP und Web-Server
SMTP und Mail-Server
FTP und FTP-Server
■
■
Performance (XML)
Gremien mit dominanten Vertretern mit Partikulärinteressen
Standards z.T. komplex, zu allgemein gehalten (Kompromiss standarts)
Erweiterbarkeit führt zu Interoperabilitätsproblemen
■ Standardisierung (W3C & WSI Gremium)
■
■
SOAP 1.2, WSDL 1.1 (1.2 und 2.0)
Zusätzliche Protokolle basierend auf SOAP und WSDL
School of Engineering
© K. Rege, ZHAW
7 von 64
School of Engineering
© K. Rege, ZHAW
8 von 64
Web Services - SOAP
■ SOAP: Simple Object Access Protocol
■
Definiert ein Standard-Format für den Transport von XML Daten, via HTTP, SMTP und FTP für den
Zugriff auf Web Services
■ WSDL: Web Service Description Language
■
Beschreibt die Schnittstelle eines Web Service (Ein-/Ausgabe Parameter, Protokoll Bindung, etc.)
■ UDDI: Universal Description, Discovery, and Integration
■
(Weltweites) Verzeichnis von Web Services in dem nach verschiedenen Kriterien gesucht werden kann
SOAP
Pu
bli
z
Fi
nd
e
UDDI
UDDI
Verzeichnis
Verzeichnis
ier
e
Service Verzeichnis
Service Konsument
HTTP-Request
SOAP
SOAP
Klient
Klient
SOAP
SOAP
Fassade
Fassade
HTTP-Response
WSDL
WSDL
School of Engineering
© K. Rege, ZHAW
9 von 64
Basis Web Service Stack
Web Services
Service
ServiceVerzeichnis
Verzeichnis
UDDI
UDDI
Service
ServiceBeschreibung
Beschreibung
WSDL
WSDL
XML
XMLMessaging
Messaging
SOAP
SOAP
Transport
TransportNetzwerk
Netzwerk
HTTP,
HTTP,SMTP,...
SMTP,...
School of Engineering
Service Anbieter
© K. Rege, ZHAW
10 von 64
Erweiterter Web Service Stack
■ In konkreten Anwendungsfall von Web Services sind Erweiterungen notwendig für
Sicherheit, Transaktionssteuerung, etc.
• stellt Verzeichnis für Web Services zur Verfügung
Service Architektur
GeschäftsGeschäftsLogik
Logik
• ermöglicht das Eintragen von Services (Publikation)
• ermöglicht Finden von Adressen anhand folgender Kriterien
• Weisse Seiten: nach Namen
• Gelbe Seiten: nach Branchen
• Grüne Seiten: Beschreibung der Dienstleistung
■ Werden angeboten
■
• beschreibt die Schnittstelle des Web Services in maschinenlesbarer
Form
■
vom Anbieter des WS Infrastruktur ( Microsoft, IBM, Open Source)
Standards z.T. noch nicht etabliert -> proprietäre, z.T. nicht interoperable Lösungen
• unabhängig von Programmiersprache
• beschreibt, welcher Transportmechanismus verwendet wird*
Anwendung
Anwendung
• beschreibt, wo der Service zu finden ist*
Workflow,
Workflow,
BPEL, XLANG(MS)
BPEL, XLANG(MS)
Network
NetworkTransport
TransportLayer
Layer
TCP/IP
*Design Fehler
WS-Attachement
WS Adressing
BinäreAnhänge
Anhänge
Binäre
WS-Attachement
Addressierung
Addressierung
WS Adressing
WS Transactions
WS Reliable Messaging
.
Zuverlässigkeit
Zuverlässigkeit
WS Reliable Messaging
SOAP
SMTP, FTP
SOAPTransport
TransportHTTP,
HTTP, SMTP, FTP
WS Security
• im Intranet: auch andere Protokolle möglich: MQ
Transaktionen
Transaktionen
WS Transactions
• im Internet: basiert auf bestehenden Internet Protokollen: http, smtp, ftp
Sicherheit
Sicherheit
WS Security
XML
XMLMessaging
MessagingSOAP
SOAP
• stellt Transportmechanismus für Daten zur Verfügung
UDDI
• kann Transport Netzwerk verwenden (gebunden werden)
WSDL
.NET, JAX-WS
.NET, JAX-WS
• unabhängig von BS
ServiceVerzeichnis
Verzeichnis
Service
UDDI
.
XML
XMLMessaging
MessagingAPI
API
• meistens SOAP Format (XML basiert)
ServiceBeschreibung
Beschreibung
Service
WSDL
• definiert das Meldungsformat
TCP/IP
School of Engineering
© K. Rege, ZHAW
11 von 64
School of Engineering
© K. Rege, ZHAW
12 von 64
WS-*
SOAP Konkret
Step 2 – Workshops & Community Dev
Step 2 – Workshops & Community Dev
■ Stand der Implementierung (Ende 2008)
■ einfaches Nachrichtenformat in XML
Step 3 – Standardization
Step 3 – Standardization
Step 4 – Approved Standard
Step 4 – Approved Standard
WS-Federation
WS-Federation
WS-Management
WS-Management
Devices
Devices
Profile
Profile
WS-Secure
WS-Secure
Conversation
Conversation
WS-Business
WS-Business
Activity
Activity
WS-Trust
WS-Trust
WS-Atomic
WS-Atomic
Transaction
Transaction
WS-Security
WS-Security
WS-Reliable
WS-Reliable
Messaging
Messaging
WS-Coordination
WS-Coordination
WS-Transfer
WS-Transfer
WS-Enumeration
WS-Enumeration
WS-Eventing
WS-Eventing
SOAP
SOAP
WS-Addressing
WS-Addressing
MTOM
MTOM
Infrastructure
Infrastructure
and
andProfiles
Profiles
■
■
Metadata
Metadata
WS-Metadata
WS-Metadata
Exchange
Exchange
Assurances
Assurances
■ Unabhängig vom Transportprotokoll
WS-Discovery
WS-Discovery
■ SOAP ist erweiterbar
UDDI
UDDI
■
■
WS-Policy
WS-Policy
■
Messaging
Messaging
WSDL
WSDL
XML
XML
Namespaces
Namespaces
School of Engineering
MIME
MIME
■
Foundation
Foundation
SOAP
SOAP/ /UDP
UDP
Sicherheit
Authentifikation
etc.
■ Verschiedene Meldungsaustauschmuster durch kombination einzelner Nachrichten
(Message Exchange Patterns)
XML Schema
XML Schema
XML
XMLInfoset
Infoset
XML 1.0
XML 1.0
für Verpackung beliebiger Anwendungsdaten
einzelne Nachrichten („one-way“)
one-way, request-response
Client
Client
1: GetTime_Request
2: GetTime_Response
Server
Server
SOAP / HTTP
SOAP / HTTP
© K. Rege, ZHAW
13 von 64
Funktionsweise von SOAP über HTTP
School of Engineering
© K. Rege, ZHAW
14 von 64
SOAP Interaktionsmodelle
Client
Web Service
■ One Way: SOAP/SMTP
<soapenv:Envelope>
<soapenv:Body>
<m:GetStockPrice>
<Stock>INTC</Stock>
</m:GetStockPrice>
</soapenv:Body>
</soapenv:Envelope>
■
Einweg Kommunikation: nur unbestätigte Aufruf
Meldung vom Klient zum Web Service
■ Request-Response: SOAP/HTTP (hier
behandelt)
■
Synchrone Kommunikation: Aufruf Meldung vom Klient
zum Web Service mit Antwort vom Web Service
Request (HTTP:POST)
■ Solicit Response: SOAP/SMTP
Response (HTTP : 200 OK)
Client
<soapenv:Envelope>
<soapenv:Body>
<m:GetStockPriceResponse>
<Price>34.5</Price>
</m:GetStockPriceResponse>
</soapenv:Body>
</soapenv:Envelope>
School of Engineering
© K. Rege, ZHAW
■
StockQuote
Service
Asynchrone Kommunikation: einzelne unbestätigte
Aufruf Meldung vom Klient zum Web Service, dann
unbestätigte Antwort zurück
■ Notification: POP3
■
Beispiel Request-Response
Beispiel Request-Response
15 von 64
Benachrichtigung: einzelne unbestätigte Meldung vom
Web Service zum Klient
School of Engineering
© K. Rege, ZHAW
16 von 64
Aufbau einer SOAP Meldung
POST/objectURI HTTP/1.1
Informationen für den
Transport der Nachricht
Objekt Endpunkt
SOAPAction
Objekt Identifikation
Informationen für den/die
Empfänger der Nachricht
soapenv:Envelope
soapenv:Header
Header 1
SOAP Meldungen
Methoden Identifikation
Erweiterungskopfteil
Informationen über die
Daten der Nachricht,
Unterschrift, etc.
Header 2
Meldungsdaten Daten
soapenv:Body
Logische Aufteilung
Daten der Nachricht
Daten
SOAP Nachricht
School of Engineering
© K. Rege, ZHAW
17 von 64
Beispiel: Aufbau einer SOAP Meldung
School of Engineering
© K. Rege, ZHAW
18 von 64
HTTP-Header
■ POST
HTTP
HTTPHeader
Header(def:
(def:HTTP)
HTTP)
■
SOAP Aufruf meist über POST
■ Content-Type:
POST /Accounts HTTP/1.1
Host: www.webservicebank
.com
www.webservicebank.com
Content-Length: nnnn
Content-Type: text/xml
; charset="
utf-8"
-8"
text/xml;
charset="utf
SOAPAction:
SOAPAction: "Some-URI"
<?xml version="1.0" encoding="UTF-8"?>
SOAP Envelope
SOAP Envelope
<SOAP:Envelope xmlns:SOAP="http://schemas.
xmlsoap.org/soap/envelope/"
.org/soap/envelope/"
xmlns:SOAP="http://schemas.xmlsoap
(def: SOAP)
(def: SOAP)
SOAP:encodingStyle
="http://schemas.xmlsoap
xmlsoap.org/soap/encoding/">
.org/soap/encoding/">
SOAP:encodingStyle="http://schemas.
<SOAP:Header>
SOAP Header
SOAP Header
<t:Signature xmlns:t="some-URI"
="1">
xmlns:t="some-URI" SOAP:mustUnderstand
SOAP:mustUnderstand="1">
(def: SOAP,opt)
(def: SOAP,opt)
5984928340298340238475272938420348
</t:Signature>
Header Entry
Header
Entry
</SOAP:Header>
(def:Applikation)
(def:Applikation)
<SOAP:Body>
<m:Deposit xmlns:m="Some-URI">
xmlns:m="Some-URI">
SOAP Body
<acctNumber>1234567890</
acctNumber>
>
acctNumber>1234567890</acctNumber
SOAP Body
(def:SOAP)
<amount>200</amount>
(def:SOAP)
Body Entry
Body Entry
</m:Deposit>
(def:Applikation)
(def:Applikation)
</SOAP:Body>
</SOAP:Envelope>
School of Engineering
© K. Rege, ZHAW
19 von 64
■
text/xml und charset=utf-8 (Unicode variabler Länge)
■ Host: Ziel-Maschinenname
■ SOAPAction:
■
für Routing und Dispatching von SOAP Meldungen
■ ab SOAP 1.2 nicht mehr verwendet, da nur für HTTP gültig
■ Action: "" bei POST wird direkt der Endpunkt des Services angegeben
Request
POST /axis/services/MyService HTTP/1.0
POST /axis/services/MyService HTTP/1.0
Content-Type: text/xml; charset=utf-8
Content-Type: text/xml; charset=utf-8
Host: localhost
Host: localhost
SOAPAction: ""
SOAPAction: ""
… …
… …
Content-Length: 414
Content-Length: 414
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
School of Engineering
Response
HTTP/1.1 200 OK
HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Type: text/xml; charset="utf-8"
… …
… …
Content-Length: 564
Content-Length: 564
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
© K. Rege, ZHAW
20 von 64
HTTP-Aufruf (GET-POST)
Beispielaufruf via HTTP-GET bzw. -POST
■ Aufruf über HTTP-GET
■
■
Aufruf von GetTime(bool shortForm) bei Web-Service
http://localhost/time/TimeService.asmx
Aufruf HTTP-kodiert (URL-encoded)
Response XML-kodiert
Aufruf :
Î Einschränkung auf einfache Aufrufe (keine Header-Einträge, keine strukturierten
Daten)
■ Aufruf über HTTP-POST
■
■
http://localhost/time/TimeService.asmx/GetTime?shortForm=true
http://localhost/time/TimeService.asmx/GetTime?shortForm=true
HTTP-Response:
Datenteil des POST-Request enthält SOAP-kodierte Anfrage
Antwort SOAP-kodiert
HTTP/1.1
HTTP/1.1200
200OK
OKContent-Type:
Content-Type:text/xml;
text/xml;charset=utf-8
charset=utf-8Content-Length:
Content-Length:length
length<?xml
<?xml
version="1.0"
version="1.0"encoding="utf-8"?>
encoding="utf-8"?>
<string
<stringxmlns="http://tempuri.org/">string</string>
xmlns="http://tempuri.org/">string</string>
Î ohne Einschränkungen
School of Engineering
© K. Rege, ZHAW
21 von 64
School of Engineering
© K. Rege, ZHAW
SOAP Envelope
SOAP Header
■ Envelope Element
■ Kann verwendet werden um anwendungsspezifische Information zur Meldung
hinzuzufügen, z.B. Authentisierung, Transaktionssteuerung
■
definiert in Namespace: http://
schemas.
.xmlsoap.
http://schemas
xmlsoap.org/
org/soap/
soap/envelope/
envelope/
■
beinhaltet Kind-Elemente
■ Header: Kopfteil (optional) : Informationen über die Meldung
■ Body: Daten (Payload)
■ Fault: als Teil von Body (optional) bei Fehler
■
22 von 64
wird dem Body vorangestellt
■ Ermöglicht das "piggybacking" von Metainformation (Information über Daten)
■
■
■
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:
http://
://schemas
schemas.
.xmlsoap.
soapenv:Envelope xmlns:
xmlns:soapenv="
soapenv="http
xmlsoap.org/
org/soap/
soap/envelope/"
envelope/"
Envelope
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
EnvelopeNamespaces
Namespaces
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
>
<soapenv:
soapenv:Header>
Header>
… …
</soapenv
:Header>
</soapenv:
Header>
<soapenv:
soapenv:Body>
Body>
… …
<soapenv
:fault>
<soapenv:
fault>
Schema Namespaces
Schema Namespaces
… …
</soapenv
:fault>
</soapenv:
fault>
</soapenv
:Body>
</soapenv:
Body>
</soapenv
:Envelope>
</soapenv:
Envelope>
zusätzliche (Status) Informationen
Sicherheit, etc.
Wird von der Infrastruktur interpretiert
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP:Header
>
<SOAP:Header soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/>
<SOAP:Header soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/>
<t:Signature
some-URI"
-URI"
<t:Signature xmlns:t="
xmlns:t="some
<t:Signature xmlns:t="some-URI"
SOAP:mustUnderstand
="1" xsi:type="xsd:string">
>
SOAP:mustUnderstand="1"
SOAP:mustUnderstand="1" xsi:type="xsd:string">
5984928340298340238475272938420348
5984928340298340238475272938420348
</t:Signature
>
</t:Signature>
</t:Signature>
</SOAP:Header
>
</SOAP:Header>
</SOAP:Header>
</soapenv:Envelope>
</soapenv:Envelope>
School of Engineering
© K. Rege, ZHAW
23 von 64
School of Engineering
© K. Rege, ZHAW
24 von 64
SOAP Body
Die Datenformat im <Body>-Element
■ Im Body werden die eigentlichen Daten übertragen
■ Daten im <Body> Element sind grundsätzlich frei wählbar (wellformed XML)
■ Meist jedoch durch Schema definierte Struktur
literal:
literal:on-the-wire
on-the-wireFormat
Formatinin
einem
einemSchema
Schemadefiniert
definiert(exact)
(exact)
document:
document:ÜberÜbermittlung
mittlungeines
eines
Dokuments
Dokuments
Request
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header …/>
<soapenv:Header …/>
<soapenv:Body>
Body>
<soapenv:Body>
<m:Deposit
Some-URI">
-URI">
<m:Deposit xmlns:m="
xmlns:m="Some
<m:Deposit xmlns:m="Some-URI">
<acctNumber>1234567890</
acctNumber>
>
acctNumber>1234567890</acctNumber
<acctNumber>1234567890</acctNumber>
<amount
>200</amount
amount>
>
<amount>200</
<amount>200</amount>
</m:Deposit
>
</m:Deposit>
</m:Deposit>
</soapenv:Body>
Body>
</soapenv:Body>
Response
rpc:
rpc:Aufruf
Aufrufeiner
einer
Funktion
Funktion
</soapenv:Envelope>
</soapenv:Envelope>
School of Engineering
© K. Rege, ZHAW
25 von 64
… Die Daten im <Body>-Element
encoded:
encoded:on-the-wire
on-the-wireFormat
Formatentspricht
entspricht
nicht
nichtdem
demSchema
Schemasondern
sonderndem
demdefinierten
definierten
Encoding
z.B
SOAPEndcoding
Encoding z.B SOAPEndcoding
<soap:envelope>
<soap:envelope>
<soap:body>
<soap:body>
<myMethodData>
<myMethodData>
<x>5</x>
<x>5</x>
</myMethodData>
</myMethodData>
</soap:body>
</soap:body>
</soap:envelope>
</soap:envelope>
<soap:envelope>
<soap:envelope>
<soap:body>
<soap:body>
<myMethodData>
<myMethodData>
<x xsi:type="xsd:int">5</x>
<x xsi:type="xsd:int">5</x>
</myMethodData>
</myMethodData>
</soap:body>
</soap:body>
</soap:envelope>
</soap:envelope>
<soap:envelope>
<soap:envelope>
automatisch
automatisch
<soap:body>
<soap:body>
<myMethod>
<myMethod>
<x>5</x>
<x>5</x>
</myMethod>
</myMethod>
</soap:body>
</soap:body>
</soap:envelope>
</soap:envelope>
<soap:envelope>
<soap:envelope>
automatisch
<soap:body>
automatisch
<soap:body>
<myMethod>
<myMethod>
<x xsi:type="xsd:int">5</x>
<x xsi:type="xsd:int">5</x>
</myMethod>
</myMethod>
</soap:body>
</soap:body>
</soap:envelope>
</soap:envelope>
School of Engineering
© K. Rege, ZHAW
26 von 64
Serialisierung von Datenstrukturen
■ Abbildung der einfachen Datentypen der Programmiersprache
■ Nachrichtenformat:
■
■
rpc
Methodenname als Teil der Meldung
■
document
Methodenname nicht Teil der Meldung
folgende Abbildungsregeln (=Binding) werden für Java angewandt
JAX-B-Compatible Type Mapping
■ Kodierung:
■
literal
Daten werden nach einem XML-Schema kodiert
■
encoded
Daten werden nach SOAP-Regeln (Section 5) kodiert
■ übliche Kombinationen:
■
document/literal
die heute am häufigsten verwendetes Format, beste Interoperabilität
■
rpc/literal
verwendet bei Java Umfeld, weniger Hilfs-/Wrapper Klassen
■
rpc/encoded
früher häufig verwendet
School of Engineering
© K. Rege, ZHAW
http://java.sun.com/webservices/docs/1.5/tutorial/doc/JAXBWorks2.html
http://java.sun.com/developer/technicalArticles/WebServices/jaxb/
27 von 64
School of Engineering
© K. Rege, ZHAW
28 von 64
… Serialisierung von Datenstrukturen
… Serialisierung von Datenstrukturen
„single-reference“ und "nested" Strukturen (Klassen) werden eingebettet
<e:Book>
<title>My Life and Work</title>
<author>
<name>Henry Ford</name>
<address>
<email>mailto:[email protected]</email>
<web>http://www.henryford.com</web>
</address>
</author>
</e:Book>
■ Einfache Datentypen werden einfach in XML Elemente abgebildet
■
■
■
Element-Name = Variablen Name
Element-Inhalt = Wert
Typ durch XSD Schema definiert
xsi:type=„xsd:string
xsi:type=„xsd:string
„multi-reference“ Strukturen verwenden id & href attributes
<title>
My Life and Work
</title>
<price>
49.95
</price>
<e:Books>
<e:Book>
<title>My Life and Work</title>
<author href="#Person-1"/>
</e:Book>
<e:Book>
<title>The Success of Tin Lizzy</title>
<author href="#Person-1"/>
</e:Book>
</e:Books>
<e:Person id="Person-1">
<name>Henry Ford</name>
<address>
<email>mailto:[email protected]</email>
<web>http://www.henryford.com</web>
</address>
</e:Person>
xsi:type=„xsd:float
xsi:type=„xsd:float
■ Arrays und Listen einfach als Sequenz von gleichen XML Elementen
Andere Collections
Andere Collections
problematisch
problematisch
School of Engineering
© K. Rege, ZHAW
29 von 64
School of Engineering
© K. Rege, ZHAW
Konsequenzen des litteral Formats
SOAP Fault
■ Body Daten sind durch Schema bzw. WSDL beschrieben
■ Fault: Ein Fehler ist aufgetreten
■
■
Vorteil: Meldung kann mit Schema validiert werden
Nachteil: Bei nicht Baum Daten Strukturen komplex (Z.B. Graphen, Mehrfachreferenzen)
■
30 von 64
erstes/einziges Element von Body
■ faultcode: Klassifizierung des Fehlers
■
■
<?xml version="1.0" ?>
<?xml version="1.0" ?>
<xsd:schema>
<xsd:schema>
■
■
<xsd:complexType name="arg">
<xsd:complexType name="arg">
<xsd:sequence>
<xsd:sequence>
<xsd:element type="xsd:double" name="arg0"/>
<xsd:element type="xsd:double" name="arg0"/>
<xsd:element type="xsd:double" name="arg1"/>
<xsd:element type="xsd:double" name="arg1"/>
</xsd:sequence>
</xsd:sequence>
</xsd:complexType >
</xsd:complexType >
MustUnderstand (Header with mustUnderstand=1 nicht verstanden)
VersionMismatch (falsche namespace)
Client (Fehler in request Meldung vom Klienten)
Server (Fehler auf der Server Seite)
■ faultString/detail: Beschreibung des Fehlers
HTTP
HTTPResult:
Result:500
500
HTTP/1.1 500 Internal Server Error
Content-Type: text/xml; charset=utf-8
<xsd:element name="op1" type="listing3:op1Type" />
<xsd:element name="op1" type="listing3:op1Type" />
</wsdl:types>
</wsdl:types>
<soapenv:Envelope … >
<soapenv:Body>
<soapenv:Fault>
<faultcode>ns1:Server.userException</faultcode>
<faultstring>java.rmi.RemoteException: Overflow</faultstring>
<detail><ns2:stackTrace xmlns:ns2="http://xml.apache.org/axis/">java.rmi.RemoteException:
</xsd:schema>
...
</xsd:schema>
...
<soapenv:Body>
<soapenv:Body>
<arg>
<arg>
<arg0>20.0</arg0>
<arg0>20.0</arg0>
<arg1>22.0</arg1>
<arg1>22.0</arg1>
</arg>
</arg>
</soapenv:Body>
</soapenv:Body>
</soapenv:Envelope>
</soapenv:Envelope>
at calc.CalculatorSoapBindingImpl.add(CalculatorSoapBindingImpl.java:12)
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
School of Engineering
© K. Rege, ZHAW
31 von 64
School of Engineering
© K. Rege, ZHAW
32 von 64
Fragen und Fakten zu WSDL
■
Wieso sollte man WSDL kennen?
■
■
■
Wieso ist WSDL so kompliziert?
■
■
Servicebeschreibung mit WSDL
■
■
■
© K. Rege, ZHAW
33 von 64
früh entwickelt (noch bevor XSD fertig definiert war)
grosse Allgemeinheit abgedeckt (Protokolle, Aufrufmodelle, etc.)
Werkzeuge zur Erstellung
■
School of Engineering
Standard-Beschreibungssprache für Web Service Schnittstellen
finden von Interoperabilitätsproblemen
Texteditor: ziemlich mühsam (sollte man aber einmal gemacht haben)
mit graphischen Werkzeugen: einfacher aber kein Standard, z.B. XMLSpy
Finden von WSDL
■
die meisten Web-Service Implementationen liefern Schnittstelle (automatisch)
■
<Web Service URL>?WSDL
■
Verzeichnisse auf dem Internet (siehe Anhang)
School of Engineering
© K. Rege, ZHAW
Service Schnittstellen Beschreibung
Web Service Description Language (WSDL)
■ Funktionen einer Schnittstellen Beschreibungssprache (IDL)
■ WSDL ist XML-basierte IDL für Web-Services
■
■
von Menschen lesbar und erstellbar
■ Definition der Schnittstelle (SW Engineering ⇒ zuerst)
"interface first" Ansatz
■ Dokumentation
34 von 64
■ in WSDL wird beschrieben:
von Maschine lesbar
■ zur Laufzeit: überprüfen ob Daten mit Schnittstelle konform(Validierung)
■ zur Entwicklungszeit: Generierung von Hilfsklassen
■ Implementierungsrumpf für Web Services
■ Stub (Stumpf) für den Aufruf
■
Service Interface
■ Verwendete Datentypen
■ Aufbau einzelner Nachrichten
■ Operationen (Methoden)
■
Service Implementation
■ Protokolle um Operationen aufzurufen
■ Adressen für Web-Service
■ Web Service Definition Language WSDL
■
■
WSDL 1.0 15. März 2001 definiert
Version 2.0 (früherer Name = 1.2) seit Juni 2007 W3C Recommendation
■ Umbenennung: Port->Endpoint; definition -> describtion; Interface-> Interface
■ Elimination von Message (-> wird zu XSD Complex Type)
School of Engineering
© K. Rege, ZHAW
35 von 64
School of Engineering
© K. Rege, ZHAW
36 von 64
Struktur eines WSDL Dokuments
Aufbau eines WSDL Dokuments
■ Struktur eines WSDL Dokuments (von 1.1 zu 2.0)
■
■
■
z.B.
z.B.HTTP+SOAP
HTTP+SOAP
message -> x
portType -> interface
port -> endpoint
EndPoint
Verwendung
Verwendungvon
von
XML-Schema
XML-Schema
Operation
Type/
Element
EndPoint
Service
Binding
(Interface)
Interface
(abstraktes
Interface)
Operation
request/
response
Types
Type/
Element
Type/
Element
EndPoint
Operation
Operationen
Web Service
Protokoll
abstraktes Interface
Typen &
Elemente
http://ssagara.blogspot.com/2009/01/converting-wsdl11-to-wsdl20-using-woden.html
http://en.wikipedia.org/wiki/Web_Services_Description_Language
School of Engineering
© K. Rege, ZHAW
37 von 64
Aufbau eines WSDL Dokuments
School of Engineering
© K. Rege, ZHAW
38 von 64
Grundstruktur von WSDL 2.0
■ Type/Element
Definiert Typen und Strukturen als XML Schema
■ Request/Response Data Strukture Type
■
definieren wie die Typen verwendet werden
■ Operation
■
verknüpft 2 (1) Meldung: request-response
WSDL-Beschreibung eines Web-Services
<definitions>
Typen beschrieben in <xsd:schema>
<types>
<xsd;...>
einzelne Nachrichten
</xsd:...>
Teile der Nachricht
<xsd:complexType>
</xsd:complexType>
abstrakter
</types>
Teil
Interface-Beschreibung
<interface>
Operationen eines Interfaces
<operation>
Input-Nachricht
<input>
Output-Nachricht
<output>
</operation>
</interface>
Binden von Interfaces an Protokolle + Kodierung
<binding>
Beschreibung der Anbindung für jede Operation
<operation>
</binding>
konkreter
Servicebeschreibung
<service>
Teil
URI und Anbindung für Endpoint
<endpoint>
</service>
</definitions>
abstraktes Interface
■
■ Interface
■ Binding
■
fügt protokollspezifische Information zu Interface hinzu
■ EndPoint
■
ist die Schnittstelle eines Web Services (instance)
■ (Web) Service kann verschiedene Schnittstellen (EndPoints) haben
School of Engineering
© K. Rege, ZHAW
Protokoll
verknüpft mehrere Operationen zu einem abstrakten Interface
Web Service
■
39 von 64
School of Engineering
© K. Rege, ZHAW
40 von 64
Beispiel Abstrakter Teil
Beispiel Konkreter Teil
■ Types Abschnitt der WSDL
■ Konkreter Teil
■
■
häufig in separate XSD Datei und mittels <include> hineingenommen
<?xml version="1.0" encoding="UTF-8"?>
<description xmlns="http://www.w3.org/ns/wsdl"
xmlns:tns="http://www.example.com/wsdl20sample"
xmlns:whttp="http://www.w3.org/ns/wsdl/http"
xmlns:wsoap="http://www.w3.org/ns/wsdl/soap"
targetNamespace="http://www.example.com/wsdl20sample">
<!-- Abstract types -->
<types>
<xs:schema xmlns="http://www.example.com/wsdl20sample"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.com/wsdl20sample">
<xs:element name="request">
<xs:complexType>
<xs:sequence>
<xs:element name="header" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="body" type="xs:anyType" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
School of Engineering
<xs:element name="response">
<xs:complexType>
<xs:sequence>
<xs:element name="header" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="body" type="xs:anyType" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</types>
■
@WebService()
@WebService()
public class Timer {
public class Timer {
@WebMethod
@WebMethod
public String getTime(String format) {
public String getTime(String format) {
...
...
}
}
}
}
<!-- Concrete Binding Over HTTP -->
<binding name="InterfaceHttpBinding" interface="tns:Interface"
type="http://www.w3.org/ns/wsdl/http">
….
<operation ref="tns:getTime" whttp:method="POST"/>
</binding>
<!-- Web Service offering endpoint -->
<service name="TimeService" interface="tns:Timer">
<endpoint name="ServiceSoapEndpoint"
binding="tns:InterfaceHttpBinding"
address="http://www.example.com/soap/"/>
</service>
</description>
<!-- Abstract interfaces -->
<interface name="Timer">
<operation name="getTime" pattern="http://www.w3.org/ns/wsdl/in-out">
<input messageLabel="GetMsg" element="tns:request"/>
<output messageLabel="SuccessfulMsg" element="tns:response"/>
</operation>
</interface>
© K. Rege, ZHAW
beschreibt das verwendete Protokoll
■ für jede einzelne Operation
■ heute oft auch noch REST Binding
beschreibt die URL des Endpoints
■ oft Ursache von Problemen (später)
41 von 64
Aufbau eines WSDL Dokuments - Struktur
School of Engineering
© K. Rege, ZHAW
42 von 64
Interface - Typen & Elemente
abstraktes Interface
■ Die Typen und Elemente werden mittels XML Schemas beschrieben
Protokoll
<wsdl:definitions
<wsdl:definitions name="Calculator"
name="Calculator"
targetNamespace="http://localhost:8080/axis/Calculator"
targetNamespace="http://localhost:8080/axis/Calculator" Namesspaces
Namesspaces
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:impl="http://localhost:8080/axis/Calculator"
…… >zusätzlicher
Schemas
xmlns:impl="http://localhost:8080/axis/Calculator" …import
…import
>zusätzlicherSchemas
<wsdl:types>
<wsdl:types> <xsd:schema>
<xsd:schema> ...
... </xsd:schema>
</xsd:schema>
<xsd:import>
<xsd:import> namespace="…"
namespace="…" location
location == "…"
"…" />
/>
<xs:element
<xs:element name="request"
name="request" name="addResponse">
name="addResponse">
</xs:element
</xs:element >>
Binding
Bindingdefiniert
definiert
<xs:element
endpoint
<xs:element name="response">
name="response">
endpointTyp:
Typ:. .Interface
Interface
</xs:element
>
</xs:element >
</wsdl:types>
</wsdl:types>
<wsdl:interface
<wsdl:interface name="Calculator">
name="Calculator">
...
... ...
...
</wsdl:interface>
</wsdl:interface>
<wsdl:binding
<wsdl:binding name="CalculatorSoapBinding"
name="CalculatorSoapBinding" type="impl:Calculator">
type="impl:Calculator">
...
endpoint
... ...
...
endpointfügt
fügtprot.
prot.
</wsdl:binding>
abh. Bindung hinzu
</wsdl:binding>
Web Service
abh. Bindung hinzu
<wsdl:service
<wsdl:service name="CalculatorService">
name="CalculatorService">
<wsdl:endpointbinding="impl:CalculatorSoapBinding"
<wsdl:endpointbinding="impl:CalculatorSoapBinding" name="Calculator">
name="Calculator">
</wsdl:endpoint>
</wsdl:endpoint>
</wsdl:service>
</wsdl:service>
Service
</wsdl:definitions>
Servicemit
mit
</wsdl:definitions>
■ Deklaration der Typen, die in Aufruf verwendet werden
■
double add(double a, double b)
<wsdl:types>
<wsdl:types>
<xsd:schema
<xsd:schema targetNamespace='http://localhost:8080/axis/CalcMessage/'
targetNamespace='http://localhost:8080/axis/CalcMessage/'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns:typens='http://localhost:8080/axis/CalcMessage/'>
xmlns:typens='http://localhost:8080/axis/CalcMessage/'>
<xsd:element
<xsd:element name="op1"
name="op1" type="xsd:double"
type="xsd:double" />
/>
<xsd:element
<xsd:element name="op2"
name="op2" type="xsd:double"
type="xsd:double" />
/>
<xsd:element
name="result"
type="xsd:double"
<xsd:element name="result" type="xsd:double" />
/>
</xsd:schema>
</xsd:schema>
</wsdl:types>
</wsdl:types>
<soapenv:Body>
<soapenv:Body>
<ns1:add xmlns:ns1="http://localhost:8080/axis/Calculator">
<ns1:add xmlns:ns1="http://localhost:8080/axis/Calculator">
<arg0 xsi:type="xsd:double">20.0</arg0>
<arg0 xsi:type="xsd:double">20.0</arg0>
<arg1 xsi:type="xsd:double">22.0</arg1>
<arg1 xsi:type="xsd:double">22.0</arg1>
</ns1:add>
</ns1:add>
</soapenv:Body>
</soapenv:Body>
</soapenv:Envelope>
</soapenv:Envelope>
EndPoints
EndPoints
School of Engineering
© K. Rege, ZHAW
43 von 64
School of Engineering
© K. Rege, ZHAW
44 von 64
Interface - Typen & Elemente Komplexe Typen
Einbezug von externen Schemas
■ Es können eigene Typen definiert werden
■ Oft besser Datentypen nicht in WSDL sondern in externen Schemas zu definieren
■
■ Grundsätzlich voller XSD Umfang,
■
■
aber meist nicht vollständig implementiert
■
können in mehreren WSDL verwendet werden
übersichtlicher
Werkzeugunterstützung
<?xml version="1.0" ?>
<?xml version="1.0" ?>
<xsd:schema targetNamespace="urn:listing3"
<xsd:schema targetNamespace="urn:listing3"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import namespace="http://www.w3.org/2001/XMLSchema"/>
<xsd:import namespace="http://www.w3.org/2001/XMLSchema"/>
<wsdl:types>
<wsdl:types>
<xsd:schema
<xsd:schema targetNamespace='http://localhost:8080/axis/CalcMessage/'
targetNamespace='http://localhost:8080/axis/CalcMessage/'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns:typens='http://localhost:8080/axis/CalcMessage/'>
xmlns:typens='http://localhost:8080/axis/CalcMessage/'>
<xsd:simpleType name="op1Type">
<xsd:simpleType name="op1Type">
<xsd:restriction base="xsd:double" />
<xsd:restriction base="xsd:double" />
</xsd:simpleType>
</xsd:simpleType>
<xsd:simpleType
<xsd:simpleType name="op1Type">
name="op1Type">
<xsd:restriction
<xsd:restriction base="xsd:double"
base="xsd:double" />
/>
</xsd:simpleType>
</xsd:simpleType>
<xsd:element name="op1" type="listing3:op1Type" />
<xsd:element name="op1" type="listing3:op1Type" />
</wsdl:types>
</wsdl:types>
</xsd:schema>
</xsd:schema>
<wsdl:types>
<wsdl:types>
<xsd:schema
<xsd:schema targetNamespace='http://localhost:8080/axis/CalcMessage/'
targetNamespace='http://localhost:8080/axis/CalcMessage/'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns:typens='http://localhost:8080/axis/CalcMessage/'>
xmlns:typens='http://localhost:8080/axis/CalcMessage/'>
<xsd:import
<xsd:import namespace="urn:listing3"
namespace="urn:listing3" schemaLocation="listing3.xsd"
schemaLocation="listing3.xsd" />
/>
<xsd:element
<xsd:element name="op1"
name="op1" type="typens:op1Type"
type="typens:op1Type" />
/>
</wsdl:types>
</wsdl:types>
School of Engineering
© K. Rege, ZHAW
45 von 64
<xsd:element
<xsd:element name="op1"
name="op1" type="listing3:op1Type"
type="listing3:op1Type" />
/>
</xsd:schema>
</xsd:schema>
</wsdl:types>
</wsdl:types>
School of Engineering
© K. Rege, ZHAW
Interface - message und part
abstraktes Interface - Interface
■ Definition wie die Typen verwendet werden:
■ Interface definiert ein (abstraktes) Interface
■
■
fasst definierte Typen zu Meldungen zusammen
entspricht in Java der Liste der formalen Parameter in Methode:
■
■
■ enthält eine oder mehrere operations
■
[double] add([double a, double b])
es können auch direkt XSD Typen verwendet werden:
entspricht in Java dem Interface
■ Definiert Eingabe und Ausgabe-Meldung
element="xsd:double"
■
■
<wsdl:types>
<wsdl:types>
<xsd:schema … … >
<xsd:schema … … >
<xsd:element name="op1" type="xsd:double" />
<xsd:element name="op1" type="xsd:double" />
<xsd:element name="op2" type="xsd:double" />
<xsd:element name="op2" type="xsd:double" />
<xsd:element name="result" type="xsd:double" />
<xsd:element name="result" type="xsd:double" />
</xsd:schema>
</xsd:schema>
</wsdl:types>
</wsdl:types>
interface
interface Calculator
Calculator {{
double
double add(double
add(double a,
a, double
double b);
b);
}}
wsdl:input = request
wsdl:output = response
"Messages"
<xs:element name="request">
<xs:element name="request">
...
...
</xs:element>
</xs:element>
Types
Name
Namedes
desMeldungstyp
Meldungstyp
<xs:element
<xs:element name="request">
name="request">
...
...
</xs:element>
</xs:element>
Typ
Typdes
desMeldungsteils
Meldungsteils(part)
(part)
<xs:element
<xs:element name="response">
name="response">
...
...
</xs:element>
</xs:element>
Namen der Operation(en)
Namen der Operation(en)
© K. Rege, ZHAW
<xs:element name="response">
<xs:element name="response">
...
...
</xs:element>
</xs:element>
Name
Namedes
desInterfaces
Interfaces
<wsdl:Interface
<wsdl:Interface name="Calculator">
name="Calculator">
<wsdl:operation
<wsdl:operation name="add"
name="add" pattern="http://www.w3.org/ns/wsdl/in-out">
pattern="http://www.w3.org/ns/wsdl/in-out">
<wsdl:input
<wsdl:input messageLabel="addRequestOp"
messageLabel="addRequestOp" element="tns:request"/>
element="tns:request"/>
<wsdl:output
<wsdl:output messageLabel="addResponseOp"
messageLabel="addResponseOp" element="tns:response"/>
element="tns:response"/>
</wsdl:operation>
</wsdl:operation>
</wsdl:Interface>
</wsdl:Interface>
Meldungen für request und response
Meldungen für request und response
Namen
Namendes
desMeldungsteils
Meldungsteils
School of Engineering
46 von 64
47 von 64
School of Engineering
© K. Rege, ZHAW
48 von 64
Protokoll - binding
konkretes Interface: EndPoint und Service
Interface
■ binding: bindet Interface an Protokoll
<wsdl:Interface name="Calculator">
<wsdl:Interface name="Calculator">
<wsdl:operation name="add" … >
<wsdl:operation name="add" … >
<wsdl:input name="addRequestOp" … />
<wsdl:input name="addRequestOp" … />
<wsdl:output name="addResponseOp" … />
<wsdl:output name="addResponseOp" … />
</wsdl:operation>
</wsdl:operation>
</wsdl:Interface>
</wsdl:Interface>
■ enthält eine oder mehrere operations
■
Alle
Alle
Operationen
Operationen
entspricht Aufbau von Interface
■ Service definiert
■
endpoint: protokollabhängiges, konkretes Interface
■ mehrere EndPoints, für verschiedene Protokolle möglich
■
wsdlsoap:address : Adress-Element des EndPoints
■ location Attribut: URI des EndPoints
<wsdl:binding
<wsdl:binding name="CalculatorSoapBinding"
name="CalculatorSoapBinding" type="impl:Calculator">
type="impl:Calculator">
Name
Namedes
des
<wsdlsoap:binding
Interfaces
<wsdlsoap:binding style="rpc"
style="rpc"
Interfaces
Transport="http://schemas.xmlsoap.org/soap/http"/>
Transport="http://schemas.xmlsoap.org/soap/http"/>
verwende
<wsdl:operation
verwendeHTTP
HTTP
<wsdl:operation name="add">
name="add">
Name der
für
<wsdl:input
Name der
fürTransport
Transport
<wsdl:input name="addRequestOp">
name="addRequestOp">
Operation
Operation
Namen des
Namen des
EndPoints
EndPoints
…… ……
</wsdl:input>
</wsdl:input>
<wsdl:output
<wsdl:output name="addResponseOp">
name="addResponseOp">
…… ……
</wsdl:output>
</wsdl:output>
</wsdl:operation>
</wsdl:operation>
</wsdl:binding>
</wsdl:binding>
<wsdl:binding name="CalculatorSoapBinding" ...>
<wsdl:binding name="CalculatorSoapBinding" ...>
<wsdlsoap:binding />
<wsdlsoap:binding />
<wsdl:operation name="add">
<wsdl:operation name="add">
...
...
</wsdl:operation>
</wsdl:operation>
</wsdl:binding>
</wsdl:binding>
Namen
Namendes
desService
Service
<wsdl:service
<wsdl:service name="CalculatorService">
name="CalculatorService">
<wsdl:endpoint
<wsdl:endpoint name="Calculator"
name="Calculator" binding="impl:CalculatorSoapBinding"
binding="impl:CalculatorSoapBinding" >>
<wsdlsoap:address
<wsdlsoap:address
location="http://localhost:8080/axis/services/Calculator"/>
location="http://localhost:8080/axis/services/Calculator"/>
</wsdl:endpoint>
</wsdl:endpoint>
</wsdl:service>
</wsdl:service>
Namen der
Namen der
Operationsteile
Operationsteile
URL des Web Services
URL des Web Services
School of Engineering
© K. Rege, ZHAW
49 von 64
Steuerung des Serialisierungsformats
■
"literal" : übermittelte Daten im Body entsprechen (exakt) dem Schema.
"encoded": übermittelte Daten im Body sind nach encodingStype Attribut definiertem Verfahren codiert
(z.B. Section 5)
■
encodingStyle: identifiziert Regel, wie serialisiert werden soll
■
es können beliebige (eigene) Encodingformate definiert werdenn
■
oft Section 5 Encoding "http://schemas.xmlsoap.org/soap/encoding/"
■
class addRequestOp {
class addRequestOp {
double a,b
double a,b
}
}
double
double add(addRequestOp
add(addRequestOp msg);
msg);
© K. Rege, ZHAW
■ Detaillierte Fehlermeldung kann definiert werden
■ fault folgt dem body Element
■
■
"rpc" erstes Kind Element von Body Element wird automatisch erzeugt (
Namen der Method);
Daten werden als Kind Elemente übergeben
double
"dokument" es wird nur ein Element beim Aufruf übergeben;
double add(double
add(double a,
a, double
double b);
b);
diese Element enthält alle Daten
School of Engineering
50 von 64
gleich wie input und output: message,Interface, binding
■ Wird eher selten gemacht
■ style: beschreibt den Stil (Struktur) des Aufruf
■
© K. Rege, ZHAW
Fehler: Faults
■ use: beschreibt auf welche grundsätzliche Art die Daten serialisiert werden sollen
■
School of Engineering
51 von 64
Standard-Fehlerelement wird stattdessen verwendet
<wsdl:definitions ...
<wsdl:definitions ...
...
...
<wsdl:message name='overflow'>
<wsdl:message name='overflow'>
<wsdl:part name='overflowFault' element='xsd:string' />
<wsdl:part name='overflowFault' element='xsd:string' />
</wsdl:message>
</wsdl:message>
<wsdl:Interface ...
<wsdl:Interface ...
<wsdl:operation name='add'>
<wsdl:operation name='add'>
<wsdl:input message='wsdlns:divideRequest' />
<wsdl:input message='wsdlns:divideRequest' />
<wsdl:output message='wsdlns:divideResponse' />
<wsdl:output message='wsdlns:divideResponse' />
<wsdl:fault message='typens:overflow' name='overflow' />
<wsdl:fault message='typens:overflow' name='overflow' />
</wsdl:operation> ...
</wsdl:operation> ...
<wsdl:binding name='ArithmeticsSoapBinding' type='impl:ArithmeticsEndPoint' >
<wsdl:binding name='ArithmeticsSoapBinding' type='impl:ArithmeticsEndPoint' >
<soap:binding ...
<soap:binding ...
<wsdl:operation ...
<wsdl:operation ...
<soap:body ... />
<soap:body ... />
<wsdl:fault>
<wsdl:fault>
<wsdlsoap:fault name="overflow" ... />
<wsdlsoap:fault name="overflow" ... />
</wsdl:fault>
</wsdl:fault>
</wsdl:operation>
</wsdl:operation>
School of Engineering
© K. Rege, ZHAW
52 von 64
SOAP Aufrufe in Java
■ Definition eines Java APIs for XML-based RPC (JAX-WS)
■ Sun liefert Referenz-Implementation: Teil von J2EE
JSR181
JSR181
Konkrete Implementation
Config
Config
WSDL
WSDL
Client
Client
Generierte
Generierte
Stubs
Stubs
Server
Server
WSImport,
WSGen
JAX-WS
JAX-WS
Runtime
Runtime
HTTP
HTTP
JAX-WS
JAX-WS
Runtime
Runtime
HTTP
HTTP
Web
WebServer
Server
School of Engineering
© K. Rege, ZHAW
53 von 64
School of Engineering
© K. Rege, ZHAW
Erzeugen der Client Stub Klassen
Klientenseitig : 1) Aufruf über generierten Stubs
■ Der Web Server bietet WSDL unter der URL http://localhost:8080/services?wsdl an
■ Statische Bindung an Service
54 von 64
■ WSDL Service ⇒ Service Interface (-Service)
Service Interface Implementation (-endpoint)
■ Stubs müssen mittels Kommandozeilen-Werkzeug erzeugt werden
■ Aufruf einfach
■
■
directory
directory
■
wsimport -d . -keep
-p com.javatutor.insel.ws.gen.chrisws
http://localhost:8081/services?wsdl
1) Instanziere Service
2) hole EndPoint Interface
3) rufe EndPoint Interface bzw. die implementierende Klasse
DII
Generierte
Generierte
Stubs
Stubs
JAX-WS
JAX-WS
Runtime
Runtime
WSDL
WSDL
HTTP
HTTP
Aus "Java ist auch eine Insel",
Galileo Computing
School of Engineering
© K. Rege, ZHAW
CalculatorService service = new CalculatorService();
CalculatorService service = new CalculatorService();
Calculator calc = service.getCalculatorEndPoint();
Calculator calc = service.getCalculatorEndPoint();
double d = calc.add(4,5);
double d = calc.add(4,5);
Client
Client
package der
package der
generierten
generierten
Klassen
Klassen
55 von 64
School of Engineering
wsimport
WSDL
WSDL
public interface Calculator {
public interface Calculator {
public Calculator getCalculator();
public Calculator getCalculator();
...
...
}
}
public class CalculatorService {
public class CalculatorService {
public Calculator getCalculatorEndPoint() {
public Calculator getCalculatorEndPoint() {
...
...
}
}
. . .
. . .
}
}
© K. Rege, ZHAW
56 von 64
Klientenseitig : 2) Aufruf über DII
JAX-WS mit (JSR181 Web Service Metadata)
■ Dynamic Invocation Interface : DII
■ Seit Java 6 in JDK integriert
■
Dynamischer Bindung an Service
keine WSDL nötig
■ Definition der Web Service Schnittstelle einer annotierten Java Klasse
■
Aufruf wird mittels generischen Klassen Service und Call "von Hand" aufgebaut
■ Folgende Annotation in javax.ws und javax.ws.soap definiert
■
Selber verantwortlich, dass Reihenfolge, Anzahl und Typen der Argumente korrekt
nur für einfache Beispiele geeignet, fehleranfällig
■
■
■
■
import org.apache.axis.client.Call;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.client.Service;
1)Instanziere den
1)Instanziere den
generischen Service
generischen Service
2)Erzeuge
2)Erzeugegenerisches
generisches
Call
CallObject
Object
String endpoint = "http://localhost:8080/axis/services/Calculator";
String endpoint = "http://localhost:8080/axis/services/Calculator";
String nameSpace = "http://localhost:8080/axis/Calculator";
String nameSpace = "http://localhost:8080/axis/Calculator";
Service service = new Service();
Service service = new Service();
■
optional
■
Call call = (Call) service.createCall();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpoint));
call.setTargetEndpointAddress( new java.net.URL(endpoint));
call.setOperationName(new javax.xml.namespace.QName(nameSpace, "add"));
call.setOperationName(new javax.xml.namespace.QName(nameSpace, "add"));
Object param = new Object[2];
Object param = new Object[2];
param[0] = new Double(4);
param[0] = new Double(4);
param[1] = new Double(5);
param[1] = new Double(5);
3)Setze Adresse des
3)Setze Adresse des
Services
Services
4)Setze Namen
4)Setze Namen
der Operation
der Operation
@WebService. Jede Web-Service-Implementierung muss diese Klassen-Annotation besitzen. Optionale
Elemente sind zum Beispiel name (bestimmt den <wsdl:Interface>, Standard ist der unqualifizierte Name der
Klasse bzw. Schnittstelle), targetNamespace, serviceName oder EndPointName.
@SOAPBinding. Setzt den Stil der Nachrichten auf Dokument oder RPC.
@WebMethod. Die Annotation macht eine Methode zur Web-Service-Operation. Der Standard-Name unter
<wsdl:operation> ist der Name der Methode; er lässt sich mit dem Element operationName ändern.
■
■
@WebParam. Beschreibt die Parameter genauer. Das Element name überschreibt den Parameternamen,
der sonst »argX« heißen würde, für das WSDL-Element <wsdl:part>.
@WebResult. Definiert die Rückgabe einer Web-Service-Methode genauer.
@OneWay. Für asynchrone Aufrufe.
5)Konstruiere
5)Konstruiere
Argumentliste: Object[]
Argumentliste: Object[]
Double ret = (Double) call.invoke(param);
Double ret = (Double) call.invoke(param);
Aus "Java ist auch eine Insel",
Galileo Computing
6)Führe
6)FühreAufruf
Aufrufaus
aus
School of Engineering
© K. Rege, ZHAW
57 von 64
School of Engineering
© K. Rege, ZHAW
58 von 64
Beispiel eines Servers
Erzeugen der Server Klassen
■ Service ist einfache Java Klasse (POJO)
■ Die Timer Klasse enthält Implementation von Web Service
package com.javatutor.insel.ws;
package com.javatutor.insel.ws;
import javax.jws.*;
import javax.jws.*;
import javax.jws.soap.*;
import javax.jws.soap.*;
oder
oder@SOAPBinding(style
@SOAPBinding(style==SOAPBinding.Style.DOCUMENT,
SOAPBinding.Style.DOCUMENT,
use=SOAPBinding.Use.LITERAL,parameterStyle=SOAPBinding.Paramet
use=SOAPBinding.Use.LITERAL,parameterStyle=SOAPBinding.Paramet
erStyle.BARE)
erStyle.BARE)
@WebService(name="BmiWebServices")
@WebService(name="BmiWebServices")
@SOAPBinding(style = SOAPBinding.Style.RPC)
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class MyBmiWeb {
public class MyBmiWeb {
@WebMethod
@WebMethod
public String hello( String name )
public String hello( String name )
{
{
return "Hello " + name + "!";
return "Hello " + name + "!";
}
}
}
■ Versehene mit JSR 181 Annotationen
WSDL 1.2
WSDL 1.2
ressource
ressourceFiles
Files
wsgen -r . -extension -wsdl:Xsoap1.2
-cp . -keep timerservice.Timer
@WebMethod(operationName="body-mass-index")
@WebMethod(operationName="body-mass-index")
@WebResult(name = "your-bmi")
@WebResult(name = "your-bmi")
public double bmi( @WebParam(name="height") double height,
public double bmi( @WebParam(name="height") double height,
@WebParam(name="weight") double weight )
@WebParam(name="weight") double weight )
{
{
double bmi = weight / (height * height) * 10000;
double bmi = weight / (height * height) * 10000;
System.out.println(this.getClass().getSimpleName()+" called:"+height+ " "+weight+" "+bmi);
System.out.println(this.getClass().getSimpleName()+" called:"+height+ " "+weight+" "+bmi);
return bmi;
return bmi;
}
}
Java Klasse
Java Klasse
}
Aus "Java ist auch eine Insel",
Galileo Computing
School of Engineering
© K. Rege, ZHAW
Aus "Java ist auch eine Insel",
Galileo Computing
59 von 64
School of Engineering
© K. Rege, ZHAW
60 von 64
Veröffentlichung des WebServices
Der Klient
■ In JSDK 1.6 ist auch ein Mini-WebServer integriert
■ Der Klient muss generierte Klassen importieren
■ Mittels Endpoint.publish wird der Service angemeldet
package com.javatutor.insel.ws;
package com.javatutor.insel.ws;
import com.javatutor.insel.ws.gen.chrisws.BmiWebServices;
import com.javatutor.insel.ws.gen.chrisws.BmiWebServices;
import com.javatutor.insel.ws.gen.chrisws.MyBmiWebService;
import com.javatutor.insel.ws.gen.chrisws.MyBmiWebService;
package com.javatutor.insel.ws;
package com.javatutor.insel.ws;
public class MyBmiClient
public class MyBmiClient
{
{
public static void main( String[] args )
public static void main( String[] args )
{
{
import javax.swing.JOptionPane;
import javax.swing.JOptionPane;
import javax.xml.ws.Endpoint;
import javax.xml.ws.Endpoint;
public class PublishWsOnServer
public class PublishWsOnServer
{
{
public static void main( String[] args )
public static void main( String[] args )
{
}
}
{
String endpointUrl = "http://localhost:8081/services";;
String endpointUrl = "http://localhost:8081/services";;
Object service = new MyBmiWeb();
Object service = new MyBmiWeb();
Endpoint endpoint = Endpoint.publish(endpointUrl,service);
Endpoint endpoint = Endpoint.publish(endpointUrl,service);
JOptionPane.showMessageDialog( null, service.getClass().getSimpleName()
JOptionPane.showMessageDialog( null, service.getClass().getSimpleName()
+" started on "+ endpointUrl+"\nStop Service?");
+" started on "+ endpointUrl+"\nStop Service?");
endpoint.stop();
endpoint.stop();
}
}
BmiWebServices EndPoint = new MyBmiWebService().getBmiWebServicesEndPoint();
BmiWebServices EndPoint = new MyBmiWebService().getBmiWebServicesEndPoint();
System.out.printf( "%s Your BMI is %.1f%n",
System.out.printf( "%s Your BMI is %.1f%n",
EndPoint.hello( "Chris" ),
EndPoint.hello( "Chris" ),
EndPoint.bodyMassIndex( 183, 84 ) );
EndPoint.bodyMassIndex( 183, 84 ) );
}
}
}
}
Aus "Java ist auch eine Insel",
Galileo Computing
School of Engineering
© K. Rege, ZHAW
Aus "Java ist auch eine Insel",
Galileo Computing
61 von 64
School of Engineering
© K. Rege, ZHAW
Zusammenfassung
Referenzen, Links
■ Web Service
■ Liste verfügbarer Web Services: http://www.xmethods.com/ &
http://www.webservicex.net
■
bietet Funktionen mittels Web-Technologie an
■ SOAP definiert Standardformat für Web Services, basierend auf XML
■
■ Web Services & Java home - http://java.sun.com/j2ee/webservices/index.html
Daneben eine Reihe von Diensten: UDDI, WS Security, WS Transaction
■ Java Web Services tutorial - http://java.sun.com/xml/docs.html#tutorials
■ SOAP Meldung besteht aus
■ Meist wird HTTP für den Transport verwendet
■ Java Web Services tutorial
http://java.sun.com/webservices/docs/2.0/tutorial/doc/JAXWS3.html
■ Zur Beschreibung verwendet man WSDL
■ SOAP 1.1,1.2 - http://www.w3.org/TR/SOAP
■
■
62 von 64
Envelope, Header, Body (Fault)
■ Java ist auch eine Insel von Christian Ullenboom
http://www.galileocomputing.de/openbook/javainsel6/
abstrakte Schnittstelle(Interface), Binding (EndPoint), Web Service
■ Java APIs for XML-based Communication: JAX-WS
■ JAX-WS als Teil des JDK 1.6
School of Engineering
© K. Rege, ZHAW
63 von 64
School of Engineering
© K. Rege, ZHAW
64 von 64

Documentos relacionados