SOAP Web Services mit Axis 1

+ andere TechDocs
+ SOAP Web Services
+ Apache Axis 1
+ Apache Axis 2
+ JAX-WS
+


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.



Inhalt

  1. Installation
    1. Installation Java-SDK, Ant und Tomcat
    2. Installation von Apache Axis 1
  2. Web Services anbieten
    1. Web Service erstellen per .jws
    2. Web Service erstellen mit WSDD (Web Service Deployment Descriptor)
  3. Web Services nutzen
    1. Web Service Client ohne WSDL
    2. Web Service Client mit WSDL2Java
    3. Universeller Web Service Client
    4. Clients für öffentliche SOAP Web Services
    5. Übersicht zu Parametern einiger Web Services
  4. Monitoring
    1. TCP Monitor
    2. SOAP Monitor
  5. SOAP mit Office-Programmen
    1. Microsoft Excel als SOAP-Client (mit VBA)
    2. OpenOffice als SOAP-Client
  6. Weiteres
    1. Links auf weiterführende Informationen


Installation Java-SDK, Ant und Tomcat

  1. Falls Sie bereits eine ältere Java-Version (JRE oder SDK) installiert haben, deinstallieren Sie sie (in Windows XP unter 'Start' | 'Systemsteuerung' | 'Software' | 'Java ... Entfernen').
  2. Downloaden Sie ein aktuelles Java SE JDK von http://www.oracle.com/technetwork/java/javase/downloads und installieren Sie es zum Beispiel nach 'C:\Program Files\Java\jdk1.6', so wie beschrieben unter java-install.htm.
  3. Falls Sie Ant verwenden wollen: Downloaden Sie die Ant-Installationsdatei (z.B. 'apache-ant-1.8.2-bin.zip') von http://ant.apache.org. Entpacken Sie das Ant-Archiv in ein temporäres Verzeichnis, kopieren Sie den darin enthaltenen Ant-Ordner (z.B. 'apache-ant-1.8.2') zum Beispiel nach 'D:\Tools' und umbenennen Sie ihn in 'D:\Tools\ant'.
  4. Installieren Sie Tomcat (z.B. Version 4.1.30, Datei 'jakarta-tomcat-4.1.30.zip'),
    siehe jsp-install.htm#InstallationUnterWindows.
  5. Einige Anwendungen erwarten korrekt gesetzte Umgebungsvariablen (Environment-Variablen). Sie ändern die Umgebungsvariablen unter Windows XP unter 'Start' | rechter Mausklick auf 'Arbeitsplatz' | 'Eigenschaften' | 'Erweitert' | 'Umgebungsvariablen' (unter Linux siehe linux.htm#Umgebungsvariablen).
    Benutzervariablen setzen:
    JAVA_HOMEC:\Program Files\Java\jdk1.6
    CATALINA_HOMED:\Tools\Tomcat
    Systemvariablen erweitern um:
    Path<vorherigerPath>;C:\Program Files\Java\jdk1.6\bin;D:\Tools\ant\bin
    Passen Sie die Pfadangaben an Ihre Java-SDK-, Ant- und '<tomcat-root>'-Verzeichnisse an.
  6. Starten Sie den Tomcat-Server über '<tomcat-root>/bin/startup.bat' und warten Sie bis der Startvorgang beendet ist (je nach Tomcat-Version kann z.B. der Text 'Jk running' erscheinen). Sie erhalten unter http://localhost:8080 (oder bei geändertem HTTP-Port unter http://localhost) die Tomcat-Begrüßungsseite.
    Stoppen Sie Tomcat mit '<tomcat-root>/bin/shutdown.bat'.
  7. Fügen Sie in '<tomcat-root>\conf\tomcat-users.xml' folgende Zeilen nach '<tomcat-users>' ein:
    <role rolename="admin"/>
    <role rolename="manager"/>
    <user username="MeinName" password="MeinPasswort" roles="admin,manager"/>
    Jetzt können Sie Tomcat über http://localhost:8080/manager/html administrieren.


Installation von Apache Axis 1

  1. Downloaden Sie das Apache-Axis-Archiv (z.B. 'axis-bin-1_2.zip') von 'http://ws.apache.org/axis/' in ein temporäres Verzeichnis und entpacken Sie es. Kopieren Sie aus dem Apache-Axis-Archiv nicht den darin enthaltenen Hauptordner, sondern das sich unter 'webapps' befindliche 'axis'-Verzeichnis in das '<tomcat-root>\webapps'-Verzeichnis.
  2. 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.

  3. Starten Sie Tomcat und rufen Sie auf:
    http://localhost:8080/axis.
    Die Axis-Begrüßungsseite meldet sich.
    Überprüfen Sie die Seite:
    http://localhost:8080/axis/happyaxis.jsp.
    Unter 'Needed Components' darf keine Fehlermeldung sein.
  4. Einige wenige Web Services können Sie ohne speziellen Client im Webbrowser benutzen. Zwei solche Web Services sind in dem Axis-Paket enthalten. Rufen Sie bei aktivem Tomcat auf:
    http://localhost:8080/axis/services/Version?method=getVersion und http://localhost:8080/axis/EchoHeaders.jws?method=list.
    Sie erhalten XML-Dateien, in denen Sie ausgefüllte Rückgabetexte finden.


Web Service erstellen per .jws

  1. 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).

  2. 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.

  3. 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.

  4. Um zu beweisen, dass wir wirklich einen SOAP Web Service erstellt haben, müssten wir jetzt eigentlich einen Client programmieren, der den SOAP-Dienst nutzt. Dies werden wir auch bald machen, aber vorher soll noch im Folgenden der "bessere" Weg zur Erstellung von SOAP Web Services vorgestellt werden (nämlich per .java-Datei und WSDD).


Web Service erstellen mit WSDD (Web Service Deployment Descriptor)

  1. 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. Dies ist zum Beispiel für Eclipse hier beschrieben.
    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

  2. 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.

  3. 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>
    
  4. Ö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=Quadrat&in1=12.7

    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

  5. Beachten Sie, dass dieser Web Service (anders als der über .jws erzeugte) nicht über den Java-Klassennamen, sondern über den im Web Service Deployment Descriptor 'deploy.wsdd' definierten Namen angesprochen wird.
  6. Der gezeigte Web Service Deployment Descriptor 'deploy.wsdd' installiert den Web Service mit dem Binding-Style und -Use 'RPC / encoded'. Lesen Sie in jee-tomcat-sysdeo.htm#SOAPWebServices wie Sie 'Document / literal' einstellen können.
  7. Wenn Sie nicht Java-Standardtypen, sondern stattdessen eigene Java-Objekte per Axis Web Services übertragen wollen, müssen Sie diese in der WSDD-Datei deklarieren und es muss einen 'Serializer' und einen 'Deserializer' geben.
    Für einfache JavaBean-ähnliche Objekte mit Gettern und Settern bietet Axis den 'BeanSerializer', so dass Sie Ihr Objekt einfach über '<beanMapping ...>' in der WSDD-Datei deklarieren können. Weiteres hierzu siehe:
    http://ws.apache.org/axis/java/user-guide.html#WhatAxisCanNotSendViaSOAP.
    Kompliziertere Objekte müssen Sie über '<typeMapping ...>' deklarieren und Sie müssen einen geeigneten 'Serializer' und 'Deserializer' implementieren und in der WSDD-Datei deklarieren. Hinweise dazu finden Sie unter:
    http://ws.apache.org/axis/java/user-guide.html#WhenBeansAreNotEnoughCustomSerialization.


Web Service Client ohne WSDL

  1. 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

  2. Kopieren Sie alle '.jar'-Dateien aus dem '<tomcat-root>\webapps\axis\WEB-INF\lib'-Verzeichnis in das Unterverzeichnis '<projektverzeichnis>\lib'.
  3. 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 );
      }
    }
    
  4. Ö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.

  5. Wenn Sie nicht wie im Beispiel 'MeineWebServiceKlasse2', sondern stattdessen 'MeineWebServiceKlasse1' testen wollen, ersetzen Sie in 'MeinWebServiceClient1.java' die Sourcecodezeile
    String wsEndpoint = "http://localhost:8080/axis/services/MeinWebService";
    durch
    String wsEndpoint = "http://localhost:8080/axis/MeineWebServiceKlasse1.jws";
    und compilieren Sie neu.


Web Service Client mit WSDL2Java

  1. Um die Typen der Eingangs- und Ausgangsparameter nicht manuell in die Java-Sourcen eintragen zu müssen, können Sie automatisch ermittelt werden. Dafür bieten Web Services WSDL-Dateien an (Infos über die Web Services Description Language siehe SOAP Web Services). Auch unser Beispiel-Web-Service bietet eine WSDL-Datei an, wie oben beschrieben wurde.
  2. 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 );
      }
    }
    
  3. Ö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).

  4. 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 );

  5. 'MeinWebServiceClient2' benötigt weniger Java-Codezeilen als der vorherige ''MeinWebServiceClient1' und bietet größere Typsicherheit ohne Typecasts. Das 'stub'-Objekt kann transparent so benutzt werden, als ob es das originale 'MeineWebServiceKlasse2'-Objekt wäre, obwohl sich dieses auf dem eventuell weit entfernten Server befindet.
  6. 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 );



Universeller Web Service Client

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.

  1. 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] );
      }
    }
    
  2. Ö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"



Clients für öffentliche SOAP Web Services mit WSDL2Java


Currency Convertor

  1. 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] );
      }
    }
    
  2. Ö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


Babel Fish

  1. 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 + "'" );
      }
    }
    
  2. Ö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"



Übersicht zu Parametern einiger Web Services

Lokaler Web Service per .jws
  Beschreibung
Test
WSDL
Endpoint-URL
Methode
Beispiel
Web Service erstellen per .jws
http://localhost:8080/axis/MeineWebServiceKlasse1.jws?method=meineWebServiceMethode&job=Quadrat&x=12.7
http://localhost:8080/axis/MeineWebServiceKlasse1.jws?wsdl
http://localhost:8080/axis/MeineWebServiceKlasse1.jws
meineWebServiceMethode( String job, double x )
meineWebServiceMethode( "Quadrat", 12.7 )
Lokaler Web Service mit WSDD
  Beschreibung
Test
WSDL
Endpoint-URL
Methode
Beispiel
Web Service erstellen mit WSDD (Web Service Deployment Descriptor)
http://localhost:8080/axis/services/MeinWebService?method=meineWebServiceMethode&in0=Quadrat&in1=12.7
http://localhost:8080/axis/services/MeinWebService?wsdl
http://localhost:8080/axis/services/MeinWebService
meineWebServiceMethode( String job, double x )
meineWebServiceMethode( "Quadrat", 12.7 )
GeoIPService
  Beschreibung
Test
WSDL
Endpoint-URL
SOAPAction
Namespace
Methode
Beispiel
http://www.webservicex.net/WS/WSDetails.aspx?CATID=12&WSID=64
http://www.webservicex.net/geoipservice.asmx?op=GetGeoIP
http://www.webservicex.net/geoipservice.asmx?WSDL
http://www.webservicex.net/geoipservice.asmx
http://www.webservicex.net/GetGeoIP
http://www.webservicex.net
GetGeoIP( String IPAddress )
GetGeoIP( "217.234.226.182" )
Currency Convertor
  Beschreibung
Test
WSDL
Endpoint-URL
SOAPAction
Namespace
Methode
Beispiel
http://www.webservicex.net/WS/WSDetails.aspx?WSID=10
http://www.webservicex.net/CurrencyConvertor.asmx?op=ConversionRate
http://www.webservicex.net/CurrencyConvertor.asmx?wsdl
http://www.webservicex.net/CurrencyConvertor.asmx
http://www.webserviceX.NET/ConversionRate
http://www.webserviceX.NET/
ConversionRate( Currency FromCurrency, Currency ToCurrency )
ConversionRate( Currency.fromValue( "EUR" ), Currency.fromValue( "USD" ) )
Currency Exchange Rate
  Beschreibung
Test
WSDL
Endpoint-URL
SOAPAction
Namespace
Methode
Beispiel
http://soapclient.com/XmethodsServices.html, http://www.xmethods.net/ve2/ViewListing.po;?serviceid=5
http://www.soapclient.com/soapclient?fn=soapform&template=/clientform.html&soaptemplate=/soapresult.html&soapwsdl=http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl
http://www.xmethods.net/sd/CurrencyExchangeService.wsdl
http://services.xmethods.net:80/soap
--
urn:xmethods-CurrencyExchange
getRate( String country1, String country2 )
getRate( "Euro", "USA" )
Babel Fish
  Beschreibung
Test
WSDL
Endpoint-URL
SOAPAction
Namespace
Methode
Beispiel
http://www.xmethods.net/ve2/ViewListing.po;?serviceid=14
http://www.mindreef.net/tide/scopeit/start.do?referer=xmethods&url=http://www.xmethods.net/sd/2001/BabelFishService.wsdl
http://www.xmethods.net/sd/2001/BabelFishService.wsdl
http://services.xmethods.net:80/perl/soaplite.cgi
urn:xmethodsBabelFish#BabelFish
urn:xmethodsBabelFish
BabelFish( String translationmode, String sourcedata )
BabelFish( "de_en", "Auto" )
eBay Price Watcher
  Beschreibung
Test
WSDL
Endpoint-URL
SOAPAction
Namespace
Methode
Beispiel
http://www.xmethods.net/ve2/ViewListing.po;?serviceid=1
http://www.mindreef.net/tide/scopeit/start.do?referer=xmethods&url=http://www.xmethods.net/sd/2001/EBayWatcherService.wsdl
http://www.xmethods.net/sd/2001/EBayWatcherService.wsdl
http://services.xmethods.net:80/soap/servlet/rpcrouter
--
urn:xmethods-EbayWatcher
getCurrentPrice( String auction_id )
getCurrentPrice( "1234567890" )
WHOIS
  Beschreibung
Test
WSDL
Endpoint-URL
SOAPAction
Namespace
Methode
Beispiel
http://www.soapclient.com/whois.html
http://www.soapclient.com/whois.html
http://www.SoapClient.com/xml/SQLDataSoap.wsdl
http://www.SoapClient.com/xml/SQLDataSoap.WSDL
http://soapclient.com/SQLDataSRL
http://www.SoapClient.com/xml/SQLDataSoap.xsd
ProcessSRL( String SRLFile, String RequestName, String key )
ProcessSRL( "/xml/whois.sri", "whois", "ibm.com" )
Web Searches (z.B. Google)
  Beschreibung
Test
WSDL
Endpoint-URL
SOAPAction
Namespace
Methode
Beispiel
http://www.soapclient.com/webSearch.html
http://www.soapclient.com/webSearch.html
http://www.SoapClient.com/xml/SQLDataSoap.wsdl
http://www.SoapClient.com/xml/SQLDataSoap.WSDL
http://soapclient.com/SQLDataSRL
http://www.SoapClient.com/xml/SQLDataSoap.xsd
ProcessSRL( String SRLFile, String RequestName, String key )
ProcessSRL( "/xml/web.sri", "Google", "SOAP" )

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:



TCP Monitor


Monitoring von per 'UniversellerClient' ansprechbaren Web Services

  1. Durchlaufen Sie die im Kapitel "Universeller Web Service Client" genannten Schritte.

  2. Ö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"

  3. 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.

  4. 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"

  5. 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


Monitoring eines lokalen Web Services und 'WSDL2Java'-Clients

  1. 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.

  2. Ö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

  3. Jetzt können Sie im TCP Monitor den XML-Datenaustausch verfolgen.

  4. 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.


Monitoring eines entfernten Web Services und 'WSDL2Java'-Clients

  1. 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.

  2. Ö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

  3. Jetzt können Sie im TCP Monitor den XML-Datenaustausch verfolgen.



SOAP Monitor

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:

  1. Führen Sie alle in den Kapiteln "Web Service mit WSDD", "Web Service Client ohne WSDL" und "Web Service Client mit WSDL2Java" beschriebenen Schritte durch. Falls Sie für den TCP Monitor Endpoint-URLs und Portnummern geändert haben, setzen Sie sie wieder auf die ursprünglichen Werte zurück und compilieren Sie neu.
  2. 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>
    
  3. 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>
    
  4. Öffnen Sie ein Kommandozeilenfenster und geben Sie folgende Befehle ein:

    cd \Tools\Tomcat\webapps\axis

    javac -classpath .;WEB-INF/lib/axis.jar SOAPMonitorApplet.java

  5. Starten Sie Tomcat und rufen Sie http://localhost:8080/axis/SOAPMonitor auf.
    Schalten Sie im SOAP Monitor die Checkbox 'Reflow XML Text' ein.
  6. 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

  7. 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



Microsoft Excel als SOAP-Client (mit VBA)

Vorbereitung

Das Tabellenkalkulationsprogramm Microsoft Excel 2002 kann als SOAP-Client verwendet werden.

Auf dem PC muss das 'SOAP Toolkit 3.0' installiert sein:

  1. Downloaden Sie das 'SOAP Toolkit 3.0' (Datei 'soapsdk.exe') von http://www.microsoft.com/downloads/details.aspx?FamilyId=C943C0DD-CEEC-4088-9753-86F052EC8450&displaylang=en und installieren Sie es.
    Informationen zum 'SOAP Toolkit' finden Sie auch unter
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwxp/html/xpsoap.asp.

Für die Benutzung von Web Services müssen in Excel 'VBAProject'-'Verweise' eingefügt werden:

  1. Öffnen Sie Excel und schalten Sie über 'Ansicht' | 'Symbolleisten' die 'Steuerelement-Toolbox' ein. Es erscheint ein kleines Dialogfeld mit Dialogelementen. Wenn Sie mit der Maus über die Dialogelemente fahren, erscheinen kleine Tooltip-Hilfstexte. Klicken Sie auf 'Code anzeigen' (Symbol mit der Lupe). Es erscheint ein neues Fenster 'Mappe1 - Tabelle1 (Code)'.
  2. Wählen Sie in dieser Code-Ansicht 'Extras' | 'Verweise...' und aktivieren Sie folgende Verweise:
    Visual Basic For Applications
    Microsoft Excel Object Library
    Microsoft Soap Type Library v3.0
    Microsoft Soap WinHttp Connector Type Library (v3.0)
    Microsoft Soap WinInet Connector Type Library (v3.0)
    Microsoft Soap WSDL File Generator Type Library (v3.0)
    Microsoft XML, v4.0
    (Falls Verweise fehlen, wählen Sie die entsprechenden DLLs über 'Durchsuchen...' unter 'C:\Programme\Gemeinsame Dateien\MSSoap\Binaries'.)

Lokaler Axis-Web-Service

Als erstes Beispiel soll der oben unter 'Web Service erstellen per .jws' erstellte Web Service benutzt werden:

  1. Starten Sie Tomcat und überprüfen Sie über
    http://localhost:8080/axis/MeineWebServiceKlasse1.jws?method=meineWebServiceMethode&job=Wurzel&x=64,
    dass der Web Service aktiv geschaltet ist (es erscheint eine XML-Datei mit '8.0' als Ergebnis).
  2. Starten Sie Excel und fügen Sie die oben genannten 'VBAProject'-'Verweise' ein.
  3. Schalten Sie von der Code-Ansicht zurück auf die Tabellen-Ansicht (mit 'Alt+Tab'). Achten Sie darauf, dass Sie sich im 'Entwurfsmodus' befinden. In der oben aktivierten 'Steuerelement-Toolbox' klicken Sie auf das Button-Symbol 'Befehlsschaltfläche'. Zeichnen Sie mit gedrückter Maustaste einen Button über die vier Felder 'E2' bis 'F3'. Klicken Sie mit der rechten Maustaste auf den neu erstellten Button und tragen Sie unter 'Caption' ein: MeinWebServiceButton.
  4. Doppelklicken Sie auf den neu erstellten Button. Es wird umgeschaltet auf die Code-Ansicht (falls Ihre Excel-Version so nicht zur Code-Ansicht umschaltet, schalten Sie um über die 'Steuerelement-Toolbox' über das 'Code anzeigen'-Symbol mit der Lupe).
  5. Ersetzen Sie den Inhalt des 'Mappe1 - Tabelle1 (Code)'-Fensters durch:
    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
    
  6. Betätigen Sie 'Strg+S' und geben Sie einen Speicherort und Dateinamen für die Excel-Datei an.
  7. Schalten Sie zurück in die Tabellen-Ansicht und klicken Sie in der 'Steuerelement-Toolbox' auf das Symbol mit dem Dreieck für 'Entwurfsmodus beenden'.
  8. Fügen Sie folgende Tabellenzelleninhalte ein:
     A  B    C  
    1   
    2Quadrat 7 
    3Wurzel 25 
    Ergänzen Sie darunter weitere 'Quadrat'- oder 'Wurzel'-Zeilen. Sie können auch Fließkommazahlen eingeben.
  9. Betätigen Sie den neu erstellten 'MeinWebServiceButton'. Die Excel-Tabelle wird erweitert zu:
     A  B    C  
    1   
    2Quadrat 749
    3Wurzel 25 5
  10. Zum Debuggen schalten Sie wieder um zur Code-Ansicht und betätigen 'F8' solange, bis der Code komplett im Einzelschritt durchlaufen ist.

Currency Exchange Rate

Das folgende Beispiel benutzt den bereits oben verwendeten 'Currency Exchange Rate'-Service:

  1. Bevor Sie dieses Beispiel testen: Prüfen Sie, ob der verwendete Web Service noch aktiv ist und ob die WSDL-Datei noch erreichbar ist: http://www.xmethods.net/sd/CurrencyExchangeService.wsdl.
  2. Starten Sie Excel neu und fügen Sie die oben genannten 'VBAProject'-'Verweise' ein.
  3. Schalten Sie von der Code-Ansicht zurück auf die Tabellen-Ansicht (mit 'Alt+Tab'). Achten Sie darauf, dass Sie sich im 'Entwurfsmodus' befinden. In der oben aktivierten 'Steuerelement-Toolbox' klicken Sie auf das Button-Symbol 'Befehlsschaltfläche'. Zeichnen Sie mit gedrückter Maustaste einen Button über die vier Felder 'E2' bis 'F3'. Klicken Sie mit der rechten Maustaste auf den neu erstellten Button und tragen Sie unter 'Caption' ein: MeinWebServiceButton.
  4. Doppelklicken Sie auf den neu erstellten Button. Es wird umgeschaltet auf die Code-Ansicht.
  5. Ersetzen Sie den Inhalt des 'Mappe1 - Tabelle1 (Code)'-Fensters durch:
    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
    
  6. Betätigen Sie 'Strg+S' und geben Sie einen Speicherort und Dateinamen für die Excel-Datei an.
  7. Schalten Sie zurück in die Tabellen-Ansicht und klicken Sie in der 'Steuerelement-Toolbox' auf das Symbol mit dem Dreieck für 'Entwurfsmodus beenden'.
  8. Fügen Sie folgende Tabellenzelleninhalte ein:
     A   B      C   
    1   
    2EuroUSA 
    3EuroJapan 
    4USAJapan 
  9. Betätigen Sie den neu erstellten 'MeinWebServiceButton'. Die Excel-Tabelle wird erweitert zu:
     A   B      C   
    1   
    2EuroUSA1,2831
    3EuroJapan134,49
    4USAJapan104,82

Babel Fish

Das folgende Beispiel benutzt den bereits oben verwendeten 'Babel Fish'-Service:

  1. Bevor Sie dieses Beispiel testen: Prüfen Sie, ob der verwendete Web Service noch aktiv ist und ob die WSDL-Datei noch erreichbar ist: http://www.xmethods.net/sd/2001/BabelFishService.wsdl.
  2. Starten Sie Excel neu und fügen Sie die oben genannten 'VBAProject'-'Verweise' ein.
  3. Schalten Sie von der Code-Ansicht zurück auf die Tabellen-Ansicht (mit 'Alt+Tab'). Achten Sie darauf, dass Sie sich im 'Entwurfsmodus' befinden. In der oben aktivierten 'Steuerelement-Toolbox' klicken Sie auf das Button-Symbol 'Befehlsschaltfläche'. Zeichnen Sie mit gedrückter Maustaste einen Button über die vier Felder 'E2' bis 'F3'. Klicken Sie mit der rechten Maustaste auf den neu erstellten Button und tragen Sie unter 'Caption' ein: MeinWebServiceButton.
  4. Doppelklicken Sie auf den neu erstellten Button. Es wird umgeschaltet auf die Code-Ansicht.
  5. Ersetzen Sie den Inhalt des 'Mappe1 - Tabelle1 (Code)'-Fensters durch:
    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
    
  6. Betätigen Sie 'Strg+S' und geben Sie einen Speicherort und Dateinamen für die Excel-Datei an.
  7. Schalten Sie zurück in die Tabellen-Ansicht und klicken Sie in der 'Steuerelement-Toolbox' auf das Symbol mit dem Dreieck für 'Entwurfsmodus beenden'.
  8. Fügen Sie folgende Tabellenzelleninhalte ein:
     A   B      C   
    1   
    2de_enHallo 
    3 Auto 
    4 Haus 
  9. Betätigen Sie den neu erstellten 'MeinWebServiceButton'. Die Excel-Tabelle wird erweitert zu:
     A   B      C   
    1   
    2de_enHallohello
    3 Autocar
    4 Haushouse


OpenOffice als SOAP-Client

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



Links auf weiterführende Informationen





Weitere Themen: andere TechDocs | SOAP Web Services
© 1998-2007 Torsten Horn, Aachen