Unterabschnitte
4. Web-Service Software-Entwicklung
In diesem Kapitel möchte ich beispielhaft vermitteln,
wie man Web-Services bereitstellen kann und wie man Software
entwickeln kann, die Web-Services nutzt.
Die Entwicklung entsprechender Programme wird auf Basis
von Apache/Tomcat Axis durchgeführt. Da diese Dienste
auf Java basieren sollten entsprechende Grundkenntnisse
in der Programmierung von Java vorhanden sein,
jedoch dürften die Konzepte auch ohne solche verstanden werden.
Zum reibungslosen Entwickeln sind folgende Punkte zu erfüllen:
- Installiertes und lauffähiges Java SDK 1.4.x [20]. Die Version
ihres installierten Java können sie über den Befehl java -version
herausfinden. java muss sich dazu im Pfad befinden.
- Installierte und lauffähige Version von Apache/Tomcat
inklusive der Web-Applikation Axis 3.4.2. Für genaue
Installationsanweisungen konsultieren sie
http://ws.apache.org/axis/java/install.html.
- Der Benutzer, unter dessen Profil Tomcat läuft, benötigt
Schreibrechte auf das Axis-Verzeichnis. Unter meiner Installation
(/usr/share/java/webapps/axis) habe ich einfach mit
chown -R tomcat4.users /usr/share/java/webapps/axis Tomcat
diese Rechte zugesprochen.
Ich habe die Entwicklung auf [10, Debain/GNU Linux 3.1 Sarge] durchgeführt.
Die nachfolgende kurze Einleitung kann detaillierter unter
http://ws.apache.org/axis/java/user-guide.html nachvollzogen
werden.
Die Entwicklung eines eigenen Web-Services unter Axis gestaltet
sich erstaunlich einfach. Hat man die Voraussetzungen erfüllt,
dann steht einer Publizierung nichts mehr im Wege. Für einen
einfachen Service sind wenige Handgriffe erforderlich.
Dieser kleine Beispiel-Code stellt einen Web-Service bereit, der
für zwei Zahlen eine Berechnung durchführt (Subtraktion und Addition).
Das Beispiel mag vielleicht wenig nützlich sein, doch demonstriert es
die Einfachheit der Programmierung.
Man sollte vor der Veröffentlichung sicherstellen, dass der Code
sich kompilieren lässt. Dies kann man durch javac Calculator.jws
erreichen.
Sie können den Code
hier herunterladen
.
public class Calculator {
public int add(int i1, int i2)
{
return i1 + i2;
}
public int subtract(int i1, int i2)
{
return i1 - i2;
}
}
4.2.1.2 Veröffentlichung
Die Veröffentlichung des Web-Services ist denkbar einfach. Man muss
lediglich den entwickelten Code als Datei mit der Endung .jws A.3
speichern und in das Axis-Verzeichnis (z.B. /usr/share/java/webapps/axis/)
kopieren.
Die Axis-Installation kümmert sich nun um die Kompilation und um
Bereitstellung eines WSDL. Dies geschieht beim ersten Aufruf des Services
jedes mal erneut, wenn sich der Code seit dem letzten Aufruf geändert hat.
Unter http://localhost:8180/axis/Calculator.jws kann man den Zustand
des Services überprüfen (den Port entsprechend ihrer Installation wählen).
Achtung: Tomcat benötigt Schreibrechte auf das Verzeichnis axis/WEB-INF/
(siehe auch 4.1.
Nun könnte man sich vorstellen einen sehr aufwändigen Algorithmus in
Java zu implementieren und auf diese Weise zu publizieren. Dann können
Programme über SOAP diesen Algorithmus mit den entsprechenden Parametern
aufrufen. Um die Rechenzeit muss sich dann der Server kümmern, auf dem
dieser Service läuft.
Die eben vorgestellte Methode zur Veröffentlichung eines Web-Services
ist jedoch nicht für komplexe Infrastrukturen geeignet. Packages sind nicht
möglich, und man weiß bis zur Ausführung nicht wirklich, ob der Code
richtig funktioniert.
Zum Entwickeln komplexer Anwendungen und Infrastrukturen bietet sich
Axis Web Service Deployment Descriptor (WSDD) an. Weiterführende
Dokumentation zu diesem Thema entnehmen sie der Dokumentationsseite unter
http://ws.apache.org/axis/java/user-guide.html.
Die Nutzung des Web-Services gestaltet sich ein wenig aufwändiger:
Das folgende Beispielprogramm kontaktiert unseren Web-Service Calculator
unter http://localhost:8180/axis/Calculator.jws. Die Beschreibung
in WSDL kann unter http://localhost:8180/axis/Calculator.jws?wsdlangeschaut werden.
Der einfache Service Calculator returniert die Berechnung der beiden übergeben Parameter
``i1'' und ``i2'',
in diesem Fall einen Integer (``addResponse'' oder ``subtractResponse'').
Sie können den Code
hier herunterladen
.
1 import org.apache.axis.client.Call;
2 import org.apache.axis.client.Service;
3 import javax.xml.namespace.QName;
4
5 public class TestClient {
6 public static void main(String [] args) {
7 try {
8 String endpoint =
9 "http://localhost:8180/axis/Calculator.jws";
10
11 Service service = new Service();
12 Call call = (Call) service.createCall();
13
14 call.setTargetEndpointAddress( new java.net.URL(endpoint) );
15 call.setOperationName(new QName("http://soapinterop.org/", args[0]));
16
17 Integer ret = (Integer) call.invoke( new Object[] { Integer.valueOf(args[1]), Integer.valueOf(args[2]) } );
18
19 System.out.println("Sent '"+args[0]+" "+args[1]+" "+args[2]+"', got '" + ret + "'");
20 } // try
21 catch (Exception e) {
22 System.err.println(e.toString());
23 } // catch
24 } // main
25 } // class
Zeilen |
Beschreibung |
1-3 |
Import von benötigten Klassen |
8-9 |
Festlegung der Adresse, zu der sich der Client verbinden soll |
11-12 |
Hier werden nun ein JAX-RPC-Objekte vorbereitet:
``Service'' und ``Call''. Diese Objekte speichern Metadaten und
weiter unten dann mit zusätzlichen Parametern gefüllt und ausgeführt. |
14 |
Die in 8-9 festgelegte Adresse wird gesetzt, das Ziel der SOAP-Nachricht |
15 |
An dieser Stelle wird die aufzurufende Methode gesetzt |
17 |
Hier wird nun der eigentliche Aufruf des Services initiiert. Als Parameter
wird ein Array von Objekten übergeben, dessen Dimension mit der Definition des
Services (WSDL B) übereinstimmen muss. In unserem einfachen Beispiel sind dies
zwei Integer, von daher wird ein zweielementiger Array übergeben. |
|
Als Ergebnis erhalten wir einen Integer zurück.4.1 |
Zunächst muss man dafür sorgen, dass der Java-Compiler die benötigten
Axis-Klassen findet (.jar). Diese befinden sich unter
/usr/share/java/webapps/axis/WEB-INF/lib/. Hat mal also den
CLASSPATH gesetzt, kann man mit javac TestClient.java den Client
übersetzen.
> export CLASSPATH=...
> javac TestClient.java
Die Ausführung geschieht ähnlich. Auch hier muss man wieder dafür sorgen,
dass die benötigten Klassen auffindbar sind. Nun kann man folgende Befehle
(hier beispielhaft) ausführen:
> export CLASSPATH=...
> java TestClient add 10 20
Sent 'add 1 2', got '30'
> java TestClient subtract 10 20
Sent 'subtract 10 20', got '-10'
http://www.psitronic.de/ti/semanticweb/wsa/
|
|