Web Services

Werbung
Verteilte Systeme
SoSe 2007
Service-Oriented Architecture
und
Web Services
Service-Oriented Architecture (SOA) [1]
„
„
Ziel: Entwicklung einer robusten Architektur zur einfachen,
schnellen und sicheren Integration von Systemen und
Applikationen, verteilter und heterogener Plattformen
SOAs sind unabhängig von
„
„
„
„
„
„
der zugrundeliegenden Plattform
den verwendeten Protokollen
Programiersprachen
Hardware
…
SOAs bieten einen abstrakten Blick auf die Geschäftswelt
2
1
Service-Oriented Architecture (SOA) [2]
„
„
„
„
Zur Entwicklung solcher Systeme eignet sich die
Kombination von Java (plattformunabhängig
Programmiersprache) und XML (plattformunabhängige
Repräsentation von Daten).
Komponenten werden als Service modelliert, die über das
Netzwerk aufgerufen werden können.
Ein Service wird durch ein Interface beschrieben, das alle
Informationen enthält, um den Service aufrufen zu können.
Die Integration von Komponenten wird von der
Applikationsebene auf die Interface-Ebene verschoben, was
zu looser Kopplung führt.
3
Architektur [1]
„
SOAs können in vier Schichten unterteilt werden:
„
„
„
„
Präsentationsschicht
Prozessschicht
Serviceschicht
Systemschicht
4
2
Architekur [2]
„
„
Die Präsentationsschicht regelt die Kommunikation mit dem
Endnutzer, z.B. über einen Browser. Die Trennung von
Präsentationsschicht und Geschäftsprozessen erlaubt das
Anbieten der selben Geschäftsprozesse über
unterschiedliche Schnittstellen.
Die Prozessschicht kombiniert Services zu
Geschäftsprozessen gemäß gegebener Regeln. Durch
Trennung von Prozessen und Services wird es möglich,
Prozesse leicht zu modifizieren und neue Prozesse
anzulegen.
5
Architekur [3]
„
„
Die Serviceschicht bietet eine Menge von Services an, die
Geschäftsfunktionalität kapseln. Man unterscheidet
grobkörnige und feinkörnige Services.
Die Systemschicht enthält die tatsächliche Implementierung
eines Service der Serviceschicht. Da die Serviceschicht die
Details der Systemschicht versteckt, kann die
Implementierung leicht ausgetauscht oder modifiziert
werden.
6
3
Rollen und Operation in einer SOA [1]
7
Rollen und Operation in einer SOA [2]
„
„
„
Der Service Provider erzeugt eine Servicebeschreibung und
deployt den Service, so dass er über das Netzwerk
erreichbar ist. Die Servicebeschreibung wird bei einer oder
mehreren Service Registries mit Hilfe der publish()Operation hinterlegt und kann als Vertrag zwischen Service
Provider und Service Consumer verstanden werden.
Der Service Consumer (Serivce Requestor) sucht nach einer
Servicebeschreibung in einer oder mehreren Service
Registries mit Hilfe der find()-Operation. Nachdem er einen
passenden Service gefunden hat, nutzt er die bind()Operation, um sich an den Service zu binden. Beispielsweise
werden jetzt Stubs erzeugt, um den Service aufzurufen.
Die Service Registry macht ihre Servicebschreibungen
bekannt, damit Service Consumers einen passenden Service
finden können.
8
4
Vorteile von SOAs
„
„
„
„
„
„
„
Integration von Geschäftsprozessen
schnelle Reaktion auf Änderungen der Geschäftswelt
Interoperabilität, Plattform- und
Programmiersprachenunabhängigkeit
kürzere Time-to-Market
Wiederverwendung von Komponenten
Integration von Legacy-Systemen
langfristige Kostenersparnis
9
Unterschiede zu RPC, RMI und CORBA
„
„
„
Remote Procedure Call (RPC) verteilt Anwendungen auf
Funktionsebene.
Remote Method Invocation (RMI) und Common Object
Request Broker Architecture (CORBA) verteilen
Anwendungen auf Basis von Objekten.
In SOAs werden Anwendungen auf Ebene der Interfaces
von Services verteilt. Dies ist in der Industrie leichter
verständlich.
10
5
Web Services
„
„
Web Services ist die am meisten verbreitete Technik, um
SOAs zu implementieren
Web Services benutzen offene Standards, die von
bekannten Industrieunternehmen gemeinschaftlich
entwickelt wurden:
„
„
„
„
SOAP
Web Services Description Language (WSDL)
Universal Description, Discovery and Integration (UDDI)
Dies ermöglicht Interoperabilität zwischen verschiedenen
Anwendungen in verschiedenen Unternehmen.
11
SOAP (I)
“SOAP Version 1.2 (SOAP) is a lightweight protocol intended
for exchanging structured information in a decentralized,
distributed environment. It uses XML technologies to define an
extensible messaging framework providing a message
construct that can be exchanged over a variety of underlying
protocols. The framework has been designed to be
independent of any particular programming model and other
implementation specific semantics.”
(World Wide Web Consortium, W3C)
12
6
SOAP
„
SOAP (ehemals: Simple Object Access Protocol)
„
„
„
„
„
„
„
„
„
ist ein Kommunikationsprotokoll für die Kommunikation zwischen
Anwendungen
ist ein Format zum Senden von Nachrichten
erlaubt eine lose gekoppelte Kommunikation und ist damit zur
Kommunikation über das Internet geeignet
ist XML basiert
ist plattformunabhängig
ist sprachunabhängig
ist erweiterbar
über HTTP erlaubt das Umgehen von Firewalls
ist standardisiert (W3C Standard)
13
Aufbau einer SOAP-Nachricht [1]
„
Eine SOAP-Nachricht muss
„
„
„
in XML kodiert sein
den SOAP-Envelope Namensraum verwenden
http://www.w3.org/2001/12/soap-envelope
Eine SOAP-Nachricht darf keine
„
„
Referenz auf eine DTD enthalten
XML Processing Instructions enthalten
14
7
Aufbau einer SOAP-Nachricht [2]
<?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:Header>
...
SOAP Envelope
</soap:Header>
<soap:Body>
SOAP Header
...
<soap:Fault>
SOAP Body
...
</soap:Fault>
</soap:Body>
SOAP Fault
</soap:Envelope>
15
SOAP Header [1]
„
Der SOAP-Envelope Namensraum definiert drei Attribute,
die für Header-Elemente verwendet werden können:
„
actor
„
„
mustUnderstand
„
„
Das actor-Attribut legt fest, für welche Stationen das jeweilige
Element relevant ist.
Ein mustUnderstand-Element muss vom Empfänger verstanden
werden. Kann der Empfänger das Element nicht interpretieren, muss
die Verarbeitung des Headers abgebrochen werden.
encodingStyle
„
Das encodingStyle-Attribut legt die verwendbaren Datentypen
innerhalb des entsprechenden Elements fest.
16
8
SOAP Header [2]
„
Der SOAP Header ist optional und enthält anwendungsspezifische
Informationen (z.B. Authentifizierungsinformationen).
<?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:Header>
<h:Hello xmlns:h="http://www.example.com/sampleheader/"
soap:mustUnderstand="1">
Good Day
</h:Hello>
</soap:Header>
...
</soap:Envelope>
„
Durch das Attribut mustUnderstand wird angegeben, dass der
Empfänger das zugehörige Element verstehen können muss.
17
SOAP Body mit Request Message
„
Der SOAP Body enthält die eigentliche SOAP Nachricht. Dies
umfasst die aufzurufende Operation (Methode) und deren
Parameter.
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<echo soapenv:encodingStyle=
"http://schemas.xmlsoap.org/soap/encoding/">
<s xsi:type="xsd:string">Hallo Welt</s>
</echo>
</soapenv:Body>
</soapenv:Envelope>
18
9
SOAP Body mit Response Message
„
Eine Antwortnachricht könnte folgendermaßen aussehen:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<echoResponse soapenv:encodingStyle=
"http://schemas.xmlsoap.org/soap/encoding/">
<echoReturn xsi:type="xsd:string">Hallo Welt</echoReturn>
</echoResponse>
</soapenv:Body>
</soapenv:Envelope>
19
SOAP Fault [1]
„
Ein Fault-Element besitzt die folgenden Kind-Elemente
„
faultcode
„
faultstring
„
faultactor
„
detail
„
„
„
„
Fehlernummer zur Identifikation
menschenlesbare Beschreibung des Fehlers
Station, die den Fehler ausgelöst hat
applikationsspezifische Fehlerinformationen
20
10
SOAP Fault [2]
<soapenv:Body
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Fault>
<faultcode>soapenv:Server.userException</faultcode>
<faultstring>javax.xml.soap.SOAPException: User not
authenticated. Please authenticate first!</faultstring>
<detail>
<ns1:hostname xmlns:ns1="http://xml.apache.org/axis/">
DANGERSEEKER
</ns1:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
21
SOAP Binding
„
„
SOAP Nachrichten können generell über ein beliebiges
Transportprotokoll versendet werden (HTTP, SMTP, ...).
Üblich ist HTTP mittels GET oder POST.
POST /axis/services/EchoService HTTP/1.0
Content-Type: text/xml; charset=utf-8
Host: localhost:8090
Content-Length: 343
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<getHelloWorld/>
</soapenv:Body>
</soapenv:Envelope>
22
11
EchoService in Java
package de.fb12.informatik.webservices.server;
public class EchoService
{
public String echo(String input)
{
return input;
}
public String getHelloWorld()
{
return "Hello World!";
}
}
23
WSDL
„
WSDL (Web Services Description Language)
„
„
„
„
„
„
beschreibt den Ort eines Web Service und dessen Operationen
(Methoden)
ist XML basiert
März 2001: WSDL 1.1 wird als W3C Note veröffentlicht
Juli 2002: WSDL 1.2 wird als Working Draft veröffentlicht
Zur Zeit wird an WSDL 2.0 gearbeitet.
WSDL ist noch kein W3C Standard.
24
12
Aufbau eines WSDL-Dokuments
<?xml version="1.0" encoding="UTF-8"?>
<definitions>
<types>
<!-- Definiert die Datentypen, die der Service verwendet
mit Hilfe von XMLSchema. -->
</types>
<message>
<!-- Definiert die Nachrichten, die der Service benutzt. -->
</message>
<portType>
<!-- Definiert die Operationen (Methoden),
die vom Service angeboten werden. -->
</portType>
<binding>
<!-- Definiert das Protokoll, das der Service verwendet. -->
</binding>
</definitions>
25
Beispiel: EchoService WSDL <messages>
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
targetNamespace="http://localhost:8080/axis/services/EchoService"
xmlns:impl="http://localhost:8080/axis/services/EchoService"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:message name="echoResponse">
<wsdl:part name="echoReturn" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="getHelloWorldRequest"></wsdl:message>
<wsdl:message name="getHelloWorldResponse">
<wsdl:part name="getHelloWorldReturn" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="echoRequest">
<wsdl:part name="input" type="xsd:string"/>
</wsdl:message>
26
13
Beispiel: EchoService WSDL <portType>
<wsdl:portType name="EchoService">
<wsdl:operation name="echo" parameterOrder="input">
<wsdl:input message="impl:echoRequest" name="echoRequest"/>
<wsdl:output message="impl:echoResponse" name="echoResponse"/>
</wsdl:operation>
<wsdl:operation name="getHelloWorld">
<wsdl:input message="impl:getHelloWorldRequest"
name="getHelloWorldRequest"/>
<wsdl:output message="impl:getHelloWorldResponse"
name="getHelloWorldResponse"/>
</wsdl:operation>
</wsdl:portType>
„
„
Durch die Definition einer input message und output message wird eine
RPC Kommunikation festgelegt.
Wird keine output message definiert, findet eine one-way
Kommunikation statt.
27
Beispiel: EchoService WSDL <binding> [1]
<wsdl:binding name="EchoServiceSoapBinding" type="impl:EchoService">
<wsdlsoap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="echo">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="echoRequest">
<wsdlsoap:body
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://server.webservices.informatik.fb12.de"
use="encoded"/>
</wsdl:input>
<wsdl:output name="echoResponse">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://localhost:8080/axis/services/EchoService"
use="encoded"/>
</wsdl:output>
</wsdl:operation>
28
14
Beispiel: EchoService WSDL <binding> [2]
<wsdl:operation name="getHelloWorld">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getHelloWorldRequest">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://server.webservices.informatik.fb12.de"
use="encoded"/>
</wsdl:input>
<wsdl:output name="getHelloWorldResponse">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://localhost:8080/axis/services/EchoService"
use="encoded"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
29
UDDI (Universal Description, Discovery and Integration)
„
„
„
„
dient der Entdeckung/Auffindung und
Integration/Einbindung von Web Services
dient als Verzeichnis für WSDL erstellte Web Service
Beschreibungen
kommuniziert über SOAP
standardisiert die Art und Weise wie Unternehmen ihre
Kunden mit Informationen über Produkte und Services
erreichen
30
15
SwA (SOAP Messages with Attachments)
„
„
„
Da SOAP base64-encoding benutzt, ist es nicht geeignet,
um Binärdaten zu übertragen. (Die Nutzlast nimmt um 33%
zu.)
Daher wurde die SwA-Spezifikation eingeführt.
SwA ermöglicht es SOAP Nachrichten als MIME Nachrichten
oder mit MIME Nachrichten im Anhang zu versenden.
call
Client
Web-Service
SOAP part
attachment part 1
:
attachment part n
31
SOAP Nachrichten erstellen mit SAAJ [1]
import java.net.URL;
import javax.xml.soap.*;
public class saajEchoClient{
public static void main(String[] args){
try{
MessageFactory factory = MessageFactory.newInstance();
SOAPFactory soapFactory = SOAPFactory.newInstance();
// create new message
SOAPMessage message = factory.createMessage();
SOAPPart soapPart = message.getSOAPPart();
SOAPEnvelope envelope = soapPart.getEnvelope();
SOAPHeader header = envelope.getHeader();
SOAPBody body = envelope.getBody();
// add element to body
Name bodyName = soapFactory.createName("echo");
SOAPBodyElement bodyElement = body.addBodyElement(bodyName);
bodyElement.setEncodingStyle("http://schemas.xmlsoap.org/soap/encoding/");
// add child element to body
Name elementName = soapFactory.createName("s");
SOAPElement s = bodyElement.addChildElement(elementName);
s.setValue("Hallo Welt");
32
16
SOAP Nachrichten erstellen mit SAAJ [2]
// add attachment
AttachmentPart attach = message.createAttachmentPart();
attach.setMimeHeader("Content-Type", "text/plain");
String stringContent = "Nochmals Hallo";
attach.setContent(stringContent, "text/plain");
message.addAttachmentPart(attach);
// realize connection
SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection connection = soapConnectionFactory.createConnection();
URL endpoint = new URL("http://localhost:8080/axis/services/EchoService");
SOAPMessage response = connection.call(message, endpoint);
SOAPBody respBody = response.getSOAPBody();
System.out.println(respBody.toString());
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
33
Web Service Engines für Java
„
„
„
„
Apache Axis
Apache Axis 2
X Fire
IBM Web Sphere
34
17
Apache Axis
„
„
„
„
ist eine open-source Web Service engine des Apache Web
Services Project
ist eine Implementierung des SOAP Protocols
läuft in Verbindung mit Tomcat als SOAP Processing Engine
erlaubt den Transfer und die Bearbeitung von SOAP
Messages
35
Handler und Chain-Konzept [1]
„
„
„
„
Jede SOAP-Nachricht wird in einen Message Context
gebettet.
Dieser Kontext kann von einem Handler bearbeitet werden.
Mehrere Handler können zu einer Chain zusammengefasst
werden.
In Axis gibt es drei vordefinierte Chains:
„
„
„
Transport Chain: kümmert sich um die Übertragung und den
Empfang von Daten, z.B. HTTP Sender und Empfänger.
Global Chain: kümmert sich um Belange, die jeden Service
betreffen, z.B. security, ...
Service Chain: kümmert sich um die Belange, die jeden einzelnen
Service betreffen, z.B. Fehlerkorrektur von Eingaben, Umwandlung
von Daten, ...
36
18
Handler und Chains-Konzept [2]
Axis Engine
from client
to client
transport
chain
global
chain
service
chain
Service
(a)
Axis Engine
Caller
service
chain
global
chain
transport
chain
to target service
from target service
(b)
(a) Axis Engine auf Seite des Servers
(b) Axis Engine auf Seite des Clients
„
Jede Chain kann sowohl im request flow (eingehende Nachrichten) als
auch im response flow (ausgehende Nachrichten) verwendet werden.
37
SOAP Nachrichten erstellen
„
Apache Axis erlaubt die Verwendung eines Call-Objekts zur
Erstellung und Versendung einer SOAP-Nachricht.
public class echoClient {
public static void main(String[] args) {
try {
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new
URL("http://localhost:8080/axis/services/EchoService"));
call.setOperationName("echo");
call.addParameter("s", XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnType(XMLType.XSD_STRING);
Object[] parameters = new String[] { "Hallo Welt" };
Object returnValue = call.invoke((Object[]) parameters);
System.out.println(returnValue);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
38
19
Attachments
„
Es ist auch unter Axis möglich zu einem Call-Objekt
Attachments hinzuzufügen:
AttachmentPart a = new AttachmentPart();
a.setContentId("Procuration.mp3");
a.setDataHandler(new DataHandler(new
URL("file:///d:/Procuration.mp3")));
call.addAttachmentPart(a);
39
Web Service erstellen
„
Folgende Schritte müssen ausgeführt werden, um einen
Web Service zu erzeugen:
„
„
„
Java Klasse schreiben, die den gewünschten Dienst erbringt, und
diese kompilieren
WSDD-Datei schreiben
Geschriebene Klasse in das Verzeichnis
%TOMCAT_HOME%\webapps\axis\WEB-INF\classes kopieren,
Service deployen und Tomcat neu starten
40
20
Schritt 1: Java Klasse schreiben
package de.fb12.informatik.webservices.server;
public class EchoService
{
public String echo(String input)
{
return input;
}
public String getHelloWorld()
{
return "Hello World!";
}
}
41
Schritt 2: WSDD Datei schreiben
„
„
WSDD (Web Service deployment descriptor)
Der deployment descriptor gibt die Informationen an, die in
die Tomcat Konfiguration eingetragen werden sollen.
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="EchoService" provider="java:RPC">
<parameter name="className"
value="de.fb12.informatik.webservices.server.EchoService"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>
42
21
Schritt 3: Service deployen
„
Eine Skriptdatei mit den folgenden beiden Befehlen
kopiert die Klasse an die richtige Stelle und meldet
sie als Dienst beim laufenden Tomcat an.
copy de\fb12\informatik\webservices\server\EchoService.class
"%TOMCAT_HOME%\webapps\axis\WEBINF\classes\de\fb12\informatik\webservices\server"
java org.apache.axis.client.AdminClient deployServer.wsdd %*
„
Nach Ausführung der Skriptdatei muss der Tomcat
neu gestartet werden.
43
Handler schreiben
„
„
„
Axis ermöglicht die Verwendung selbst geschriebener
Handler. Diese können einer Chain durch einen Eintrag in
der Datei server-config.wsdd oder durch einen deployment
descriptor hinzugefügt werden.
Eine Java-Klasse muss das Interface
org.apache.axis.Handler implementieren, damit sie
als Handler einer Chain hinzugefügt werden kann.
Durch die invoke()-Methode wird die Funktionalität des
Handlers bestimmt.
44
22
Beispiel-Handler
public class AttachmentHandler implements org.apache.axis.Handler
{
...
public void invoke(MessageContext msgContext) throws AxisFault {
try {
Message m = msgContext.getCurrentMessage();
Iterator it = m.getAttachments();
while (it.hasNext()) {
AttachmentPart a = (AttachmentPart) it.next();
String filename = a.getContentId();
InputStream in = (InputStream) a.getContent();
FileOutputStream fos = new FileOutputStream(new File("e:/temp/" + filename));
byte[] b = new byte[4096];
int n;
while ((n = in.read(b)) > 0) {
fos.write(b, 0, n);
}
fos.close();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
...
}
45
Handler deployen
„
Der Handler muss wiederum an die richtige
Stelle kopiert und danach deployt werden.
copy de\fb12\informatik\webservices\server\AttachmentHandler.class
"%TOMCAT_HOME%\webapps\axis\WEBINF\classes\de\fb12\informatik\webservices\server\"
java org.apache.axis.client.AdminClient deployAttachmentHandler.wsdd %*
„
Für den AttachmentHandler ist dies durch
folgenden deployment descriptor möglich:
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<handler name="attachmentHandler" type=
"java:de.fb12.informatik.webservices.server.AttachmentHandler"/>
</deployment>
46
23
Service deployen
„
Jeder Service, der den Handler benutzen soll, muss diesen in seinen
request flow oder response flow eingetragen bekommen. Dies ist durch
folgenden deployment descriptor möglich:
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="EchoService2" provider="java:RPC">
<parameter name="className"
value="de.fb12.informatik.webservices.server.EchoService"/>
<parameter name="allowedMethods" value="*"/>
<requestFlow>
<handler type="attachmentHandler"/>
</requestFlow>
<responseFlow>
</responseFlow>
</service>
</deployment>
„
Danach muss Tomcat neu gestartet werden.
47
server-config.wsdd
„
„
In dem Verzeichnis
%TOMCAT_HOME%\Tomcat5.5\webapps\axis\WEB-INF
findet sich die Datei server-config-wsdd.
Diese Datei konfiguriert die einzelnen Chains für den
Tomcat Server und ist in vier Teile eingeteilt:
„
„
„
„
Globale Konfiguration
Handler
Services
Transport
48
24
Global Configuration
<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<globalConfiguration>
...
<parameter name="attachments.Directory" value="e:\temp\attachments"/>
<parameter name="attachments.implementation"
value="org.apache.axis.attachments.AttachmentsImpl"/>
...
<requestFlow>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="session"/>
</handler>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="request"/>
<parameter name="extension" value=".jwr"/>
</handler>
</requestFlow>
</globalConfiguration>
49
Handlers and Services
<handler name="halloHandler" type="java:HalloHandler"/>
<handler name="attachmentHandler"
type="java:de.fb12.informatik.webservices.server.AttachmentHandler"/>
<handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
<handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
<handler name="Authenticate"
type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
<service name="AdminService" provider="java:MSG">
<parameter name="allowedMethods" value="AdminService"/>
<parameter name="enableRemoteAdmin" value="false"/>
<parameter name="className" value="org.apache.axis.utils.Admin"/>
<namespace>http://xml.apache.org/axis/wsdd/</namespace>
</service>
...
<service name="EchoService2" provider="java:RPC">
<requestFlow>
<handler type="attachmentHandler"/>
</requestFlow>
<parameter name="allowedMethods" value="*"/>
<parameter name="className" value="de.fb12.informatik.webservices.server.EchoService"/>
</service>
50
25
Transport
<transport name="http">
<requestFlow>
<handler type="URLMapper"/>
<handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
</requestFlow>
...
</transport>
<transport name="local">
<responseFlow>
<handler type="LocalResponder"/>
</responseFlow>
</transport>
</deployment>
51
Literatur
„
„
„
„
SOAP Tutorial: http://www.w3schools.com/soap/
SwA: http://www.w3.org/TR/SOAP-attachments
Apache Axis: http://ws.apache.org/axis/
Graham, Davis, et al.: Building Web Services with Java
52
26
Herunterladen