Web-Services
Zurück zu Verwalten von Textbausteinen...
Dieser Abschnitt richtet sich an Programmierer, die von entfernten Systemen auf todo4teams zugreifen möchten.
todo4teams stellt eine Zugriffsmöglichkeit für entfernte Systeme mittels Web Services bereit. Diese werden als SOAP- (Simple Object Access Protocol) Services angeboten. Der SOAP-Standard wird von den meisten aktuellen Betriebssystemen und vielen Programmiersprachen unterstützt.
Funktionen
todo4teams stellt folgende Funktionen über die Webservices bereit:
hello
newJob
java.lang.String title,
java.lang.String description,
int minutes,
int ownerId)
throws java.rmi.RemoteException
newPriorityJob
java.lang.String title,
java.lang.String description,
int minutes,
int ownerId,
int priority)
throws java.rmi.RemoteException
updateJob
int addressedGroupId,
java.lang.String title,
java.lang.String description,
int minutes)
throws java.rmi.RemoteException, java.lang.Exception
getJobStatus
throws java.rmi.RemoteException, java.lang.Exception
deleteJob
throws java.rmi.RemoteException, java.lang.Exception
newJobWithMetaData
java.lang.String title,
java.lang.String description,
int minutes,
int ownerId,
int metaDataId,
java.util.Map<java.lang.String,
java.lang.Object> values)
throws java.rmi.RemoteException
newEmailFormJob
java.lang.String title,
java.lang.String description,
int minutes,
int ownerId,
int metaDataId,
java.util.Map<java.lang.String,java.lang.Object> values,
int priority,
java.lang.String replyFromEmail,
java.lang.String replyToEmail)
throws java.rmi.RemoteException
WSDL-Deskriptor
Die Schnittstelle wird vollständig durch den WSDL-Deskriptor beschrieben, der über die URL
http:~/~/<Todoserver>:8080/TodoServer/services/TodoInterface?wsdl
abgerufen werden kann.
Client-Implementierungen
Mit Hilfe des WSDL-Deskriptors verringert sich die Client-seitige Implementierung in der Regel auf wenige Zeilen. Auf den folgenden Seiten sind kurze Beispiele für die Implementierungen in verschiedenen Programmiersprachen aufgelistet.
Microsoft .NET
Die Entwicklungsumgebung Microsoft Visual Studio .NET bringt das Werkzeug wsdl.exe mit, mit dessen Hilfe sich die Client-seitige Implementierung automatisieren lässt:
Der Aufruf
wsdl.exe /language:VB http:~/~/<Todoserver>:8080/TodoServer/services/TodoInterface?wsdl
erzeugt in der Datei RpcMethodService.vb den kompletten Client-Code. Im Hauptprogramm nutzen Sie die Schnittstelle dann so:
d = New RpcMethodsService
jobid = d.newJob(76, "aus Visual Basic", "Eine Beschreibung", 45, 39))
status = d.getJobStatus(jobid)
Wenn Sie eine Implemtierung in C# wünschen, rufen Sie
wsdl.exe /language:CS http:~/~/<Todoserver>:8080/TodoServer/services/TodoInterface?wsdl##
auf, und verfahren entsprechend.
PHP
Das Beispiel verzichtet auf das Abfangen von SOAP-Exceptions, was im Echtbetrieb dringend zu implementieren ist. Es benötigt die Bibliothek NuSOAP (siehe http://sourceforge.net/projects/nusoap/).
require ('lib/nusoap.php');
$serverurl = 'http:~/~/<Todoserver>:8080/TodoServer/services/TodoInterface?wsdl';
$client = new soapclient($serverurl, true);
$param = array (
'addressedGroupId' => 22, ~/~/ ID der Adressierten Gruppe
'title' => 'Beispiel-Titel',
'description' => 'Ein Beispiel-Text',
'minutes' => 45,
'ownerId' => 39 ~/~/ ID des Besitzers);
$result = $client->call('newJob', $param, '', '', false, true);
{{/code}}
Java
Verwenden Sie die Bibliothek Axis (siehe http://ws.apache.org/axis/). Fügen Sie die Axis-Bibliotheken in den Classpath und rufen Sie
java org.apache.axis.wsdl.WSDL2Java -o . "http:~/~/<Todoserver>:8080/TodoServer/services/TodoInterface?wsdl"
auf. Im lokalen Verzeichnis werden nun die benötigten Schnittstellendateien im Paket com.proxemo.Todo.service erzeugt.
Eine Service-Aufruf erzeugen Sie dann nach diesem Vorbild:
package com.proxemo.Todo.services;
public class TestClient{
public static void main(String args[]){
try{
RpcMethods methods = new RpcMethodsServiceLocator().getTodoInterface();
int id = methods.newJob(76, "ein SOAP-Job","mit einer Beschreibung", 25, 39);
}
catch(RemoteException re){
System.out.println("Remote-Exception: "+re.getMessage());
} catch(Exception e){
e.printStackTrace();}
}
}