Web Services mit SOAP und WSDL in Java mit Apache Axis 1
In diesem Dokument geht es um Web Services mit Java und Apache Axis 1. Bitte beachten Sie, dass Axis 1 mittlerweile veraltet ist. Verwenden Sie für Neuentwicklungen besser JAX-WS, Axis2 oder ein anderes Framework für Webservices.
Erklärungen zu Web Services, SOAP, WSDL, UDDI und XML finden Sie in soap.htm und java-xml.htm.
Benutzervariablen setzen: | |
JAVA_HOME | C:\Program Files\Java\jdk1.6 |
CATALINA_HOME | D:\Tools\Tomcat |
Systemvariablen erweitern um: | |
Path | <vorherigerPath>;C:\Program Files\Java\jdk1.6\bin;D:\Tools\ant\bin |
<role rolename="admin"/> <role rolename="manager"/> <user username="MeinName" password="MeinPasswort" roles="admin,manager"/> |
In der Regel werden noch drei zusätzliche '.jar'-Libraries benötigt:
Downloaden Sie das 'JavaBeans Activation Framework' (z.B. 'jaf-1_0_2-upd2.zip') von 'http://java.sun.com/products/javabeans/glasgow/jaf.html', entpacken Sie das JAF-Archiv in ein temporäres Verzeichnis, extrahieren Sie daraus die Datei 'activation.jar' und kopieren Sie diese Datei in das '<tomcat-root>\webapps\axis\WEB-INF\lib'-Verzeichnis.
Downloaden Sie 'JavaMail' (z.B. 'javamail-1_3_2-upd.zip') von 'http://www.oracle.com/technetwork/java/javamail', entpacken Sie das JavaMail-Archiv in ein temporäres Verzeichnis, extrahieren Sie daraus die Datei 'mail.jar' und kopieren Sie diese Datei in das '<tomcat-root>\webapps\axis\WEB-INF\lib'-Verzeichnis.
Downloaden Sie die 'XML Security'-Lib (z.B. 'xmlsec-1.2.1.jar') von 'http://xml.apache.org/security/' (oder 'http://xml.apache.org/security/dist/java-library/') und kopieren Sie diese Datei in das '<tomcat-root>\webapps\axis\WEB-INF\lib'-Verzeichnis.
Für den ersten einfachen SOAP Web Service das folgende einfache Beispiel dienen,
welches von Zahlen wahlweise das Quadrat oder die Wurzel ermittelt.
Speichern Sie im Tomcat-Axis-Verzeichnis
'<tomcat-root>\webapps\axis'
die folgende Datei 'MeineWebServiceKlasse1.jws':
public class MeineWebServiceKlasse1 { public double meineWebServiceMethode( String job, double x ) { if( "Quadrat".equalsIgnoreCase( job ) ) return x * x; if( "Wurzel".equalsIgnoreCase( job ) ) return Math.sqrt( x ); return 0.; } }
Beachten Sie, dass die Dateiendung nicht '.java', sondern '.jws' lautet (für Java Web Service).
Starten Sie Tomcat und rufen Sie auf:
http://localhost:8080/axis/MeineWebServiceKlasse1.jws.
Sie erhalten die Meldung 'There is a Web Service here'.
Rufen Sie auf:
http://localhost:8080/axis/MeineWebServiceKlasse1.jws?wsdl.
Sie erhalten die WSDL-Datei zu diesem Web Service
(Infos über die Web Services Description Language siehe SOAP Web Services).
Rufen Sie auf:
http://localhost:8080/axis/MeineWebServiceKlasse1.jws?method=meineWebServiceMethode&job=Quadrat&x=12.7.
und:
http://localhost:8080/axis/MeineWebServiceKlasse1.jws?method=meineWebServiceMethode&job=Wurzel&x=64.
Sie erhalten eine XML-Datei, die das Ergebnis der Berechnung enthält.
Bitte beachten Sie, dass diese Aufrufmethoden spezielle Eigenschaften von Axis Web Services sind
und bei anderen Web Services nicht zur Verfügung stehen.
Damit ist Ihr Web Service fertig und kann verwendet werden. Allerdings sind so nur sehr einfache Web Services möglich und Sie haben kaum Einfluss auf das Deployment, die Art der Einbettung und die Auswahl der zu exportierenden Methoden.
Falls Sie die WSDL-Information als Datei benötigen, können Sie entweder
a) im Webbrowser die bereits genannte URL http://localhost:8080/axis/MeineWebServiceKlasse1.jws?wsdl eingeben und über 'Datei' | 'Speichern unter...' | 'Dateiname=MeineWebServiceKlasse1.wsdl' abspeichern, oder
b) im Kommandozeilenfenster aufrufen:
cd \Tools\Tomcat\webapps\axis\WEB-INF
set CLASSPATH=.;jwsClasses;lib/activation.jar;lib/axis.jar;lib/axis-ant.jar;lib/commons-discovery.jar;lib/commons-logging.jar;lib/jaxrpc.jar;lib/log4j.jar;lib/mail.jar;lib/saaj.jar;lib/wsdl4j.jar
java org.apache.axis.wsdl.Java2WSDL -l"http://localhost:8080/axis/MeineWebServiceKlasse1.jws" MeineWebServiceKlasse1
Bitte beachten Sie, dass Sie, wenn Sie den SOAP Web Service von einem anderen Rechner aus nutzen wollen, natürlich überall 'localhost' durch den Web-Service-Rechnernamen oder dessen IP-Adresse ersetzen müssen. Dies gilt insbesondere für die WSDL-Datei.
Unser nächster Web Service wird über eine JavaBean-ähnliche nach
'WEB-INF\classes'
kompilierte .java-Datei erzeugt.
Dazu wird normalerweise in der Entwicklungsumgebung ein Projekt gestartet und
die JSPs, Servlets und JavaBeans werden zum Application Server deployt.
Um unabhängig von der jeweiligen Entwicklungsumgebung zu sein,
werden wir (etwas unschön) die benötigten Verzeichnisse unter
'<tomcat-root>\webapps\axis\WEB-INF'
anlegen. Erzeugen Sie folgende Unterverzeichnisse:
- <tomcat-root>\webapps\axis\WEB-INF\classes
- <tomcat-root>\webapps\axis\WEB-INF\src
- <tomcat-root>\webapps\axis\WEB-INF\src\meinpackage
Speichern Sie im Verzeichnis '<tomcat-root>\webapps\axis\WEB-INF\src\meinpackage' die folgende Datei 'MeineWebServiceKlasse2.java':
package meinpackage; public class MeineWebServiceKlasse2 { public double meineWebServiceMethode( String job, double x ) { if( "Quadrat".equalsIgnoreCase( job ) ) return x * x; if( "Wurzel".equalsIgnoreCase( job ) ) return Math.sqrt( x ); return 0.; } }
Beachten Sie, dass die Dateiendung diesmal nicht '.jws', sondern '.java' lautet und das eine 'package'-Anweisung enthalten ist.
Speichern Sie im Verzeichnis '<tomcat-root>\webapps\axis\WEB-INF' folgenden Web Service Deployment Descriptor 'deploy.wsdd':
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="MeinWebService" provider="java:RPC"> <parameter name="className" value="meinpackage.MeineWebServiceKlasse2" /> <parameter name="allowedMethods" value="*" /> <parameter name="scope" value="Request" /> </service> </deployment>
Und ebenso den folgenden Undeployment Descriptor 'undeploy.wsdd':
<undeployment xmlns="http://xml.apache.org/axis/wsdd/"> <service name="MeinWebService" /> </undeployment>
Öffnen Sie ein Kommandozeilenfenster ('Start' | 'Alle Programme' | 'Zubehör' | 'Eingabeaufforderung') und geben Sie bei aktivem Tomcat folgende Befehle ein (unter Windows XP können Sie den Kommandotext im Webbrowser mit gedrückter Maustaste markieren, mit 'Strg+C' zwischenspeichern und irgendwo im Kommandozeilenfenster mit rechter Maustaste, 'Einfügen' und 'Return' ausführen):
cd \Tools\Tomcat\webapps\axis\WEB-INF
set CLASSPATH=.;lib/activation.jar;lib/axis.jar;lib/axis-ant.jar;lib/commons-discovery.jar;lib/commons-logging.jar;lib/jaxrpc.jar;lib/log4j.jar;lib/mail.jar;lib/saaj.jar;lib/wsdl4j.jar
javac -d classes src/meinpackage/MeineWebServiceKlasse2.java
java org.apache.axis.client.AdminClient deploy.wsdd
Testen Sie folgende vier Aufrufe:
http://localhost:8080/axis/services/MeinWebService
http://localhost:8080/axis/services/MeinWebService?wsdl
http://localhost:8080/axis/services/MeinWebService?method=meineWebServiceMethode&in0=Wurzel&in1=64
--> der SOAP Web Service funktioniert.
Geben Sie im Kommandozeilenfenster ein:
java org.apache.axis.client.AdminClient undeploy.wsdd
Rufen Sie auf:
http://localhost:8080/axis/services/MeinWebService
--> der SOAP Web Service ist deaktiviert.
Die Aktivierung und Deaktivierung können Sie auch anhand des Eintrags '<service name="MeinWebService" ...' in der Datei 'server-config.wsdd' verfolgen.
Zuletzt sollten Sie den Web Service aktivieren, weil wir ihn in den nächsten Kapiteln benötigen:
java org.apache.axis.client.AdminClient deploy.wsdd
Legen Sie ein Projektverzeichnis an, z.B.
'D:\Tools\WS-Axis'.
Erzeugen Sie in diesem Projektverzeichnis folgende Unterverzeichnisse:
- <projektverzeichnis>\bin
- <projektverzeichnis>\lib
- <projektverzeichnis>\src
- <projektverzeichnis>\src\meinpackage
Um obigen SOAP Web Service zu nutzen speichern Sie im Unterverzeichnis '<projektverzeichnis>\src\meinpackage' die folgende Datei 'MeinWebServiceClient1.java':
package meinpackage; import java.net.URL; import javax.xml.rpc.ParameterMode; import org.apache.axis.Constants; import org.apache.axis.client.Call; import org.apache.axis.client.Service; public class MeinWebServiceClient1 { public static void main( String[] args ) throws Exception { if( 2 != args.length ) { System.out.println( "\nTwo parameters needed.\n" + " First parameter: either 'Quadrat' or 'Wurzel'\n" + " Second parameter: a number\n" + "E.g.:\n" + " java meinpackage.MeinWebServiceClient1 Quadrat 12.7" ); System.exit( 1 ); } String wsEndpoint = "http://localhost:8080/axis/services/MeinWebService"; String wsMethod = "meineWebServiceMethode"; Service service = new Service(); Call call = (Call)service.createCall(); call.setTargetEndpointAddress( new URL( wsEndpoint ) ); call.setOperationName( wsMethod ); call.addParameter( "job", Constants.XSD_STRING, ParameterMode.IN ); call.addParameter( "x", Constants.XSD_DOUBLE, ParameterMode.IN ); call.setReturnType( Constants.XSD_DOUBLE ); Object ret = call.invoke( new Object[] { args[0], new Double( args[1] ) } ); System.out.println( "\n'" + args[0] + "' von '" + args[1] + "' ist: " + ret ); } }
Öffnen Sie ein Kommandozeilenfenster ('Start' | 'Alle Programme' | 'Zubehör' | 'Eingabeaufforderung') und geben Sie bei aktivem Tomcat (und aktivem Web Service) folgende Befehle ein (unter Windows XP können Sie den Kommandotext im Webbrowser mit gedrückter Maustaste markieren, mit 'Strg+C' zwischenspeichern und irgendwo im Kommandozeilenfenster mit rechter Maustaste, 'Einfügen' und 'Return' ausführen):
cd \Tools\WS-Axis
set CLASSPATH=.;bin;lib/activation.jar;lib/axis.jar;lib/axis-ant.jar;lib/commons-discovery.jar;lib/commons-logging.jar;lib/jaxrpc.jar;lib/log4j.jar;lib/mail.jar;lib/saaj.jar;lib/wsdl4j.jar
javac -d bin src/meinpackage/MeinWebServiceClient1.java
java meinpackage.MeinWebServiceClient1
java meinpackage.MeinWebServiceClient1 Quadrat 12.7
java meinpackage.MeinWebServiceClient1 Wurzel 64
Passen Sie den Pfad 'D:\Tools\WS-Axis' an Ihr '<projektverzeichnis>' an.
Falls Ihr Webbrowser die Zeilen umgebrochen hat, geben Sie die Blöcke (insbesondere den mit 'set CLASSPATH' beginnenden) trotzdem als ein einzelnes Kommando (mit nur einem 'Return') ein.
Wenn Sie Fehlermeldungen erhalten, überprüfen Sie genau, ob sich wirklich alle im 'CLASSPATH' aufgezählten '.jar'-Libs im 'bin'-Verzeichnis befinden.
Speichern Sie im Unterverzeichnis '<projektverzeichnis>\src\meinpackage' die folgende Datei 'MeinWebServiceClient2.java':
package meinpackage; import meinpackageWSDL2Java.*; public class MeinWebServiceClient2 { public static void main( String[] args ) throws Exception { if( 2 != args.length ) { System.out.println( "\nTwo parameters needed.\n" + " First parameter: either 'Quadrat' or 'Wurzel'\n" + " Second parameter: a number\n" + "E.g.:\n" + " java meinpackage.MeinWebServiceClient2 Quadrat 12.7" ); System.exit( 1 ); } double d = Double.valueOf( args[1] ).doubleValue(); MeineWebServiceKlasse2Service service = new MeineWebServiceKlasse2ServiceLocator(); MeineWebServiceKlasse2 stub = service.getMeinWebService(); double ret = stub.meineWebServiceMethode( args[0], d ); System.out.println( "\n'" + args[0] + "' von '" + args[1] + "' ist: " + ret ); } }
Öffnen Sie ein Kommandozeilenfenster und geben Sie folgende Befehle ein:
cd \Tools\WS-Axis
set CLASSPATH=.;bin;lib/activation.jar;lib/axis.jar;lib/axis-ant.jar;lib/commons-discovery.jar;lib/commons-logging.jar;lib/jaxrpc.jar;lib/log4j.jar;lib/mail.jar;lib/saaj.jar;lib/wsdl4j.jar
java org.apache.axis.wsdl.WSDL2Java -o src -p meinpackageWSDL2Java http://localhost:8080/axis/services/MeinWebService?wsdl
javac -d bin src/meinpackageWSDL2Java/*.java
javac -d bin src/meinpackage/MeinWebServiceClient2.java
java meinpackage.MeinWebServiceClient2 Quadrat 12.7
Wenn Sie den SOAP Web Service von einem anderen Rechner aus testen wollen, müssen Sie natürlich überall 'localhost' durch den Web-Service-Rechnernamen oder dessen IP-Adresse ersetzen (bereits beim 'WSDL2Java'-Kommando).
Der 'WSDL2Java'-Aufruf erzeugt aus einer WSDL-Datei (oder wie hier aus einer WSDL-URL) im 'meinpackageWSDL2Java'-Package-Verzeichnis zwei Interface- und zwei Implementationsklassen sowie eventuell weitere Klassen für die Parameter-Objekte.
Um in unserem Sourcecode die korrekten Klassen- und Methodennamen der generierten Klassen einzusetzen gehen Sie wie folgt vor:
Suchen Sie im '<projektverzeichnis>\src\meinpackageWSDL2Java'-Verzeichnis
die Klasse, deren Name auf 'Locator' endet
(in unserem Beispiel ist dies 'MeineWebServiceKlasse2ServiceLocator').
Schauen Sie im Sourcecode dieser Klasse nach, welches Interface sie implementiert
(in unserem Beispiel ist dies 'MeineWebServiceKlasse2Service').
Mit dieser Interface-Klasse und der 'Locator'-Klasse bilden Sie die Sourcecodezeile
MeineWebServiceKlasse2Service service = new MeineWebServiceKlasse2ServiceLocator();
Schauen Sie im Sourcecode der Interface-Klasse (hier 'MeineWebServiceKlasse2Service') nach,
wie die Methode heißt, über die Sie die gewünschte Web-Service-Stub-Klasse erhalten
(im Beispiel heißt sie 'getMeinWebService()')
und wie die returnierte Klasse heißt
(im Beispiel heißt sie 'MeineWebServiceKlasse2').
Mit diesen Namen bilden Sie die Sourcecodezeile
MeineWebServiceKlasse2 stub = service.getMeinWebService();
Zuletzt schauen Sie im Sourcecode der zuletzt genannten Klasse (hier 'MeineWebServiceKlasse2') nach,
wie die gesuchte Web-Service-Methode heißt (im Beispiel heißt sie 'meineWebServiceMethode()'),
und von welchen Typen die Parameter und der Rückgabewert sind.
Daraus bilden Sie die Sourcecodezeile
double ret = stub.meineWebServiceMethode( args[0], d );
Natürlich können Sie auf ähnliche Art und Weise auch einen Client für den Web Service 'MeineWebServiceKlasse1.jws' erstellen. Erstellen Sie die Stub-Sourcen über:
java org.apache.axis.wsdl.WSDL2Java -o src -p meinpackageWSDL2Java http://localhost:8080/axis/MeineWebServiceKlasse1.jws?wsdl
Und ändern Sie den Sourcecode folgendermaßen:
MeineWebServiceKlasse1Service service = new MeineWebServiceKlasse1ServiceLocator();
MeineWebServiceKlasse1_PortType stub = service.getMeineWebServiceKlasse1();
double ret = stub.meineWebServiceMethode( args[0], d );
Die folgende Java-Klasse 'UniversellerClient' implementiert einen generischen SOAP-Client für einfache SOAP Web Services. Sie kann zum Beispiel mit den oben erstellten Web Services kommunizieren oder im Internet verfügbare Web Services zum Beispiel zum AltaVista Babelfish Translation Service nutzen. Allerdings funktioniert sie nur mit sehr einfachen Diensten, die simple Objekte und Namespace-Strukturen verwenden und kein 'SOAPAction'-Attribut erwarten.
Speichern Sie im Unterverzeichnis '<projektverzeichnis>\src\meinpackage' die folgende Datei 'UniversellerClient.java':
package meinpackage; import java.net.URL; import org.apache.axis.client.Call; import org.apache.axis.client.Service; public class UniversellerClient { public static void main( String[] args ) throws Exception { if( 3 > args.length || 1 != args.length % 2 ) { System.out.println( "\nAt least three Parameters needed:\n" + " 1.: wsEndpoint\n" + " 2.: wsNamespace\n" + " 3.: wsMethod\n" + "Maybe you need further parameters for the Web Service method:\n" + " 4.: i | d | s (type: 'int', 'double', or 'String')\n" + " 5.: value\n" + " 6./7. ...: further type/value pairs\n" + "E.g.:\n" + "java meinpackage.UniversellerClient" + " http://services.xmethods.net:80/perl/soaplite.cgi" + " urn:xmethodsBabelFish BabelFish s de_en s \"Auto\"" ); System.exit( 1 ); } Object[] val = new Object[(args.length-3)/2]; System.out.println( "\nwsEndpoint : " + args[0] ); System.out.println( "wsNamespace : " + args[1] ); System.out.println( "wsMethod : " + args[2] ); for( int i=0; i<val.length; i++ ) { int j = i * 2 + 4; String t = args[j-1].toLowerCase(); System.out.println( "type, value : " + t + ", " + args[j] ); if( "s".equals( t ) ) val[i] = args[j]; else if( "i".equals( t ) ) val[i] = new Integer( args[j] ); else if( "d".equals( t ) ) val[i] = new Double( args[j] ); else { System.out.println( "Error: Wrong parameter type '" + t + "'." ); System.exit( 1 ); } } Service service = new Service(); Call call = (Call)service.createCall(); call.setTargetEndpointAddress( new URL( args[0] ) ); call.setOperationName( new javax.xml.namespace.QName( args[1], args[2] ) ); Object ret = call.invoke( val ); System.out.println( "Return : " + ret.getClass() ); System.out.println( " " + ret ); if( ret instanceof Object[] ) for( int i=0; i<((Object[])ret).length; i++ ) System.out.println( "ret[" + i + "] = " + ((Object[])ret)[i] ); } }
Öffnen Sie ein Kommandozeilenfenster und geben Sie folgende Befehle ein:
cd \Tools\WS-Axis
set CLASSPATH=.;bin;lib/activation.jar;lib/axis.jar;lib/axis-ant.jar;lib/commons-discovery.jar;lib/commons-logging.jar;lib/jaxrpc.jar;lib/log4j.jar;lib/mail.jar;lib/saaj.jar;lib/wsdl4j.jar
javac -d bin src/meinpackage/UniversellerClient.java
java meinpackage.UniversellerClient
Testen der beiden oben erzeugten Web Services "MeineWebServiceKlasse1.jws" und "MeinWebService":
java meinpackage.UniversellerClient http://localhost:8080/axis/MeineWebServiceKlasse1.jws "" meineWebServiceMethode s Quadrat d 12.7
java meinpackage.UniversellerClient http://localhost:8080/axis/services/MeinWebService "" meineWebServiceMethode s Wurzel d 64
Testen der öffentlichen Web Services "Babel Fish" und "Currency Exchange Rate":
java meinpackage.UniversellerClient http://services.xmethods.net:80/perl/soaplite.cgi urn:xmethodsBabelFish BabelFish s de_en s "Auto"
java meinpackage.UniversellerClient http://services.xmethods.net:80/soap urn:xmethods-CurrencyExchange getRate s Euro s USA
Testen der bei Axis mitgelieferten Web Services "Version", "EchoService.jws" und "EchoHeaders.jws":
java meinpackage.UniversellerClient http://localhost:8080/axis/services/Version "" getVersion
java meinpackage.UniversellerClient http://localhost:8080/axis/EchoService.jws "" echo s "Bitte ein Echo"
java meinpackage.UniversellerClient http://localhost:8080/axis/EchoHeaders.jws "" whoami
java meinpackage.UniversellerClient http://localhost:8080/axis/EchoHeaders.jws "" list
Testen der Übertragung von Exception-Meldetexten:
java meinpackage.UniversellerClient http://localhost:8080/axis/EchoHeaders.jws "" throwAxisFault s "Dies ist mein AxisFault-Text"
java meinpackage.UniversellerClient http://localhost:8080/axis/EchoHeaders.jws "" throwException s "Dies ist mein Exception-Text"
java meinpackage.UniversellerClient http://localhost:8080/axis/EchoHeaders.jws "" throwRuntimeException s "Dies ist mein RuntimeException-Text"
Speichern Sie im Unterverzeichnis '<projektverzeichnis>\src\meinpackage' die folgende Datei 'MeinCurrencyConvertorClient.java':
package meinpackage; import meinpackageWSDL2Java.*; public class MeinCurrencyConvertorClient { public static void main( String[] args ) throws Exception { if( 2 != args.length ) { System.out.println( "\nTwo parameters needed.\n" + " First parameter: first currency\n" + " Second parameter: second currency\n" + "E.g.:\n" + " java meinpackage.MeinCurrencyConvertorClient EUR USD" ); System.exit( 1 ); } CurrencyConvertor service = new CurrencyConvertorLocator(); CurrencyConvertorSoap_PortType stub = service.getCurrencyConvertorSoap(); double ret = stub.conversionRate( Currency.fromValue( args[0] ), Currency.fromValue( args[1] ) ); System.out.println( "\n1 " + args[0] + " = " + ret + " " + args[1] ); } }
Öffnen Sie ein Kommandozeilenfenster und geben Sie folgende Befehle ein:
cd \Tools\WS-Axis
set CLASSPATH=.;bin;lib/activation.jar;lib/axis.jar;lib/axis-ant.jar;lib/commons-discovery.jar;lib/commons-logging.jar;lib/jaxrpc.jar;lib/log4j.jar;lib/mail.jar;lib/saaj.jar;lib/wsdl4j.jar
java org.apache.axis.wsdl.WSDL2Java -o src -p meinpackageWSDL2Java http://www.webservicex.net/CurrencyConvertor.asmx?wsdl
javac -d bin src/meinpackageWSDL2Java/*.java
javac -d bin src/meinpackage/MeinCurrencyConvertorClient.java
java meinpackage.MeinCurrencyConvertorClient EUR USD
Speichern Sie im Unterverzeichnis '<projektverzeichnis>\src\meinpackage' die folgende Datei 'MeinBabelFishClient.java':
package meinpackage; import meinpackageWSDL2Java.*; public class MeinBabelFishClient { public static void main( String[] args ) throws Exception { if( 2 != args.length ) { System.out.println( "\nTwo parameters needed.\n" + " First parameter: translation languages\n" + " Second parameter: text to translate\n" + "E.g.:\n" + " java meinpackage.MeinBabelFishClient de_en \"Auto\"" ); System.exit( 1 ); } BabelFishService service = new BabelFishServiceLocator(); BabelFishPortType stub = service.getBabelFishPort(); String ret = stub.babelFish( args[0], args[1] ); System.out.println( "\n'" + args[1] + "' -->\n'" + ret + "'" ); } }
Öffnen Sie ein Kommandozeilenfenster und geben Sie folgende Befehle ein:
cd \Tools\WS-Axis
set CLASSPATH=.;bin;lib/activation.jar;lib/axis.jar;lib/axis-ant.jar;lib/commons-discovery.jar;lib/commons-logging.jar;lib/jaxrpc.jar;lib/log4j.jar;lib/mail.jar;lib/saaj.jar;lib/wsdl4j.jar
java org.apache.axis.wsdl.WSDL2Java -o src -p meinpackageWSDL2Java http://www.xmethods.net/sd/2001/BabelFishService.wsdl
javac -d bin src/meinpackageWSDL2Java/*.java
javac -d bin src/meinpackage/MeinBabelFishClient.java
java meinpackage.MeinBabelFishClient de_en "Auto"
Leider sind nicht immer alle genannten Web Services aktiv und funktionsbereit, so dass Sie etwas experimentieren müssen.
Weitere Web Services finden Sie unter:
Generischer SOAP-Client, der aus einer WSDL-Datei automatisch eine passende Eingabemaske erzeugt, interaktiv Eingabeparameter für den Web Service entgegennimmt und das Ergebnis des Web Services anzeigt:
Generisches Tool zur Anzeige und Generierung von SOAP Messages:
Durchlaufen Sie die im Kapitel "Universeller Web Service Client" genannten Schritte.
Öffnen Sie ein Kommandozeilenfenster und geben Sie bei aktivem Tomcat folgende Befehle ein:
cd \Tools\WS-Axis
set CLASSPATH=.;bin;lib/activation.jar;lib/axis.jar;lib/axis-ant.jar;lib/commons-discovery.jar;lib/commons-logging.jar;lib/jaxrpc.jar;lib/log4j.jar;lib/mail.jar;lib/saaj.jar;lib/wsdl4j.jar
javaw org.apache.axis.utils.tcpmon 8081 localhost 8080
Schalten Sie im TCP Monitor die Checkbox 'XML Format' ein.
java meinpackage.UniversellerClient http://localhost:8081/axis/MeineWebServiceKlasse1.jws "" meineWebServiceMethode s Quadrat d 12.7
java meinpackage.UniversellerClient http://localhost:8081/axis/services/MeinWebService "" meineWebServiceMethode s Wurzel d 64
java meinpackage.UniversellerClient http://localhost:8081/axis/services/Version "" getVersion
java meinpackage.UniversellerClient http://localhost:8081/axis/EchoService.jws "" echo s "Bitte ein Echo"
java meinpackage.UniversellerClient http://localhost:8081/axis/EchoHeaders.jws "" whoami
java meinpackage.UniversellerClient http://localhost:8081/axis/EchoHeaders.jws "" list
java meinpackage.UniversellerClient http://localhost:8081/axis/EchoHeaders.jws "" throwAxisFault s "Dies ist mein AxisFault-Text"
Sie können im TCP Monitor den XML-Datenaustausch verfolgen.
Ersetzen Sie im 'POST'-Fenster einen Eingabewert (z.B. die '12.7') durch einen anderen Wert.
Wenn der neue Wert kürzer oder länger als der vorherige ist, müssen Sie im Header die 'Content-Length' anpassen.
Betätigen Sie 'Resend' um die neue Antwort zu erhalten.
Nicht nur lokale Web Services sondern auch entfernte können überwacht werden, zum Beispiel der öffentlich zugängliche Web Service "Babel Fish".
Schließen Sie den TCP Monitor und öffnen Sie ihn erneut mit folgendem Kommando:
javaw org.apache.axis.utils.tcpmon 8081 services.xmethods.net 80
Schalten Sie im TCP Monitor die Checkbox 'XML Format' ein.
java meinpackage.UniversellerClient http://localhost:8081/perl/soaplite.cgi urn:xmethodsBabelFish BabelFish s de_en s "Auto"
Zum Vergleich ist hier noch mal die normale Kommandozeile ohne TCP Monitoring:
java meinpackage.UniversellerClient http://services.xmethods.net:80/perl/soaplite.cgi urn:xmethodsBabelFish BabelFish s de_en s "Auto"
Für den "Currency Exchange Rate"-Web-Service sähen die beiden Kommandozeilenaufrufe folgendermaßen aus:
javaw org.apache.axis.utils.tcpmon 8081 services.xmethods.net 80
java meinpackage.UniversellerClient http://localhost:8081/soap urn:xmethods-CurrencyExchange getRate s Euro s USA
Durchlaufen Sie die im Kapitel "Web Service Client mit WSDL2Java" genannten Schritte. Öffnen Sie im '<projektverzeichnis>\src\meinpackageWSDL2Java'-Verzeichnis die Java-Sourcedatei 'MeineWebServiceKlasse2ServiceLocator.java', ersetzen Sie überall (dreimal) 'localhost:8080' durch 'localhost:8081' und speichern Sie die Datei.
Öffnen Sie ein Kommandozeilenfenster und geben Sie bei aktivem Tomcat folgende Befehle ein:
cd \Tools\WS-Axis
set CLASSPATH=.;bin;lib/activation.jar;lib/axis.jar;lib/axis-ant.jar;lib/commons-discovery.jar;lib/commons-logging.jar;lib/jaxrpc.jar;lib/log4j.jar;lib/mail.jar;lib/saaj.jar;lib/wsdl4j.jar
javac -d bin src/meinpackageWSDL2Java/*.java
javac -d bin src/meinpackage/MeinWebServiceClient2.java
javaw org.apache.axis.utils.tcpmon 8081 localhost 8080
Schalten Sie im TCP Monitor die Checkbox 'XML Format' ein.
java meinpackage.MeinWebServiceClient2 Quadrat 12.7
Jetzt können Sie im TCP Monitor den XML-Datenaustausch verfolgen.
Ersetzen Sie im TCP Monitor im 'POST'-Fenster den Eingabewert '12.7' durch eine andere Zahl. Wenn die neue Zahl mehr oder weniger Stellen als die vorherige Zahl hat, müssen Sie im Header die 'Content-Length' anpassen. Betätigen Sie 'Resend' um die neue Antwort zu erhalten.
Durchlaufen Sie die im Kapitel
"Currency Convertor" genannten Schritte.
Öffnen Sie im
'<projektverzeichnis>\src\meinpackageWSDL2Java'-Verzeichnis
die Java-Sourcedatei 'CurrencyConvertorLocator.java',
ersetzen Sie
'http://www.webservicex.net/CurrencyConvertor.asmx' durch
'http://localhost:8081/CurrencyConvertor.asmx'
und speichern Sie die Datei.
Öffnen Sie ein Kommandozeilenfenster und geben Sie folgende Befehle ein (Tomcat kann abgeschaltet sein):
cd \Tools\WS-Axis
set CLASSPATH=.;bin;lib/activation.jar;lib/axis.jar;lib/axis-ant.jar;lib/commons-discovery.jar;lib/commons-logging.jar;lib/jaxrpc.jar;lib/log4j.jar;lib/mail.jar;lib/saaj.jar;lib/wsdl4j.jar
javac -d bin src/meinpackageWSDL2Java/*.java
javac -d bin src/meinpackage/MeinCurrencyConvertorClient.java
javaw org.apache.axis.utils.tcpmon 8081 www.webservicex.net 80
Schalten Sie im TCP Monitor die Checkbox 'XML Format' ein.
java meinpackage.MeinCurrencyConvertorClient EUR USD
Jetzt können Sie im TCP Monitor den XML-Datenaustausch verfolgen.
Eine ähnliche Funktionalität wie der TCP Monitor bietet der SOAP Monitor.
Die wichtigsten Unterschiede sind:
- Der SOAP Monitor ist nur serverseitig einsetzbar.
- Auf der Clientseite braucht nichts geändert zu werden (auch nicht Endpoint-URL und Port).
- Der SOAP Monitor kann bequem ein- und ausgeblendet werden.
- Eine Filterung der Meldungen ist möglich.
Aus Sicherheitsgründen ist der SOAP Monitor defaultmäßig deaktiviert. Führen Sie folgende Schritte aus:
Fügen Sie im Verzeichnis 'D:\Tools\Tomcat\webapps\axis\WEB-INF' in der Datei 'deploy.wsdd' folgendermaßen 'requestFlow'- und 'responseFlow'-Handler ein:
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="MeinWebService" provider="java:RPC"> <requestFlow> <handler type="soapmonitor"/> </requestFlow> <responseFlow> <handler type="soapmonitor"/> </responseFlow> <parameter name="className" value="meinpackage.MeineWebServiceKlasse2" /> <parameter name="allowedMethods" value="*" /> <parameter name="scope" value="Request" /> </service> </deployment>
Speichern Sie im Verzeichnis 'D:\Tools\Tomcat\webapps\axis\WEB-INF' die folgende Datei 'deploy-SOAPMonitor.wsdd':
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <handler name="soapmonitor" type="java:org.apache.axis.handlers.SOAPMonitorHandler"> <parameter name="wsdlURL" value="/axis/SOAPMonitorService-impl.wsdl"/> <parameter name="namespace" value="http://tempuri.org/wsdl/2001/12/SOAPMonitorService-impl.wsdl"/> <parameter name="serviceName" value="SOAPMonitorService"/> <parameter name="portName" value="Demo"/> </handler> <service name="SOAPMonitorService" provider="java:RPC"> <parameter name="allowedMethods" value="publishMessage"/> <parameter name="className" value="org.apache.axis.monitor.SOAPMonitorService"/> <parameter name="scope" value="Application"/> </service> </deployment>
Öffnen Sie ein Kommandozeilenfenster und geben Sie folgende Befehle ein:
cd \Tools\Tomcat\webapps\axis
javac -classpath .;WEB-INF/lib/axis.jar SOAPMonitorApplet.java
Geben Sie im Kommandozeilenfenster folgende Befehle ein:
cd \Tools\Tomcat\webapps\axis\WEB-INF
set CLASSPATH=.;lib/activation.jar;lib/axis.jar;lib/axis-ant.jar;lib/commons-discovery.jar;lib/commons-logging.jar;lib/jaxrpc.jar;lib/log4j.jar;lib/mail.jar;lib/saaj.jar;lib/wsdl4j.jar
java org.apache.axis.client.AdminClient undeploy.wsdd
java org.apache.axis.client.AdminClient deploy.wsdd
java org.apache.axis.client.AdminClient -lhttp://localhost:8080/axis/services/AdminService deploy-SOAPMonitor.wsdd
Jetzt ist der SOAP Monitor eingerichtet. Starten Sie die verschiedenen Clients und beobachten Sie die Ausgaben im SOAP Monitor. Bitte beachten Sie, dass die Clients den Web Service 'MeinWebService' verwenden müssen, für den Web Service 'MeineWebServiceKlasse1.jws' ist kein SOAP Monitor Handler eingerichtet.
cd \Tools\WS-Axis
set CLASSPATH=.;bin;lib/activation.jar;lib/axis.jar;lib/axis-ant.jar;lib/commons-discovery.jar;lib/commons-logging.jar;lib/jaxrpc.jar;lib/log4j.jar;lib/mail.jar;lib/saaj.jar;lib/wsdl4j.jar
java meinpackage.MeinWebServiceClient1 Quadrat 12.7
java meinpackage.MeinWebServiceClient2 Quadrat 12.7
java meinpackage.UniversellerClient http://localhost:8080/axis/services/MeinWebService "" meineWebServiceMethode s Wurzel d 64
Das Tabellenkalkulationsprogramm Microsoft Excel 2002 kann als SOAP-Client verwendet werden.
Auf dem PC muss das 'SOAP Toolkit 3.0' installiert sein:
Für die Benutzung von Web Services müssen in Excel 'VBAProject'-'Verweise' eingefügt werden:
Als erstes Beispiel soll der oben unter 'Web Service erstellen per .jws' erstellte Web Service benutzt werden:
Sub CommandButton1_Click() On Error GoTo SOAPError URL = "http://localhost:8080/axis/MeineWebServiceKlasse1.jws?wsdl" For i = 2 To 100 job = Worksheets("Tabelle1").Range("A" & i).Value x = Worksheets("Tabelle1").Range("B" & i).Value If job = "" Then Exit For End If Set service = New SoapClient30 service.MSSoapInit (URL) ret = service.meineWebServiceMethode(job, x) Worksheets("Tabelle1").Range("C" & i).Value = ret Next Exit Sub SOAPError: If service.FaultString <> "" Then MsgBox "Fehler: " & service.FaultString & " " & service.Detail Else MsgBox "Fehler: " & Err.Description End If Err.Clear End Sub
A | B | C | |
1 | |||
2 | Quadrat | 7 | |
3 | Wurzel | 25 |
A | B | C | |
1 | |||
2 | Quadrat | 7 | 49 |
3 | Wurzel | 25 | 5 |
Das folgende Beispiel benutzt den bereits oben verwendeten 'Currency Exchange Rate'-Service:
Sub CommandButton1_Click() On Error GoTo SOAPError URL = "http://www.xmethods.net/sd/CurrencyExchangeService.wsdl" For i = 2 To 100 country1 = Worksheets("Tabelle1").Range("A" & i).Value country2 = Worksheets("Tabelle1").Range("B" & i).Value If country1 = "" Then Exit For End If Set service = New SoapClient30 service.MSSoapInit (URL) ret = service.getRate(country1, country2) Worksheets("Tabelle1").Range("C" & i).Value = ret Next Exit Sub SOAPError: If service.FaultString <> "" Then MsgBox "Fehler: " & service.FaultString & " " & service.Detail Else MsgBox "Fehler: " & Err.Description End If Err.Clear End Sub
A | B | C | |
1 | |||
2 | Euro | USA | |
3 | Euro | Japan | |
4 | USA | Japan |
A | B | C | |
1 | |||
2 | Euro | USA | 1,2831 |
3 | Euro | Japan | 134,49 |
4 | USA | Japan | 104,82 |
Das folgende Beispiel benutzt den bereits oben verwendeten 'Babel Fish'-Service:
Sub CommandButton1_Click() On Error GoTo SOAPError URL = "http://www.xmethods.net/sd/2001/BabelFishService.wsdl" For i = 2 To 100 translationmode = Worksheets("Tabelle1").Range("A" & i).Value SourceData = Worksheets("Tabelle1").Range("B" & i).Value If SourceData = "" Then Exit For End If If translationmode = "" Then translationmode = translationmodeLast End If translationmodeLast = translationmode Set service = New SoapClient30 service.MSSoapInit (URL) ret = service.BabelFish(translationmode, SourceData) Worksheets("Tabelle1").Range("C" & i).Value = ret Next Exit Sub SOAPError: If service.FaultString <> "" Then MsgBox "Fehler: " & service.FaultString & " " & service.Detail Else MsgBox "Fehler: " & Err.Description End If Err.Clear End Sub
A | B | C | |
1 | |||
2 | de_en | Hallo | |
3 | Auto | ||
4 | Haus |
A | B | C | |
1 | |||
2 | de_en | Hallo | hello |
3 | Auto | car | |
4 | Haus | house |
OpenOffice bietet direkte Unterstützung für Java-Anwendungen. Einen in OpenOffice eingebundenen Web-Service-Client mit Axis stellt der Artikel "Wortschatz - Besserer OpenOffice-Thesaurus dank Web-Services" von Oliver Lau in der c't 2005.15 ab Seite 214 vor (Listings: 0515-214.zip).