SOAP::Lite

(Auszug aus "Perl & XML" von Erik T. Ray & Jason McIntosh)

Abschließend kommen wir zu einer Kategorie von Perl/XML-Software, die ihre XML-Basis so weit abstrahiert, daß sie im Grunde genommen schon lächerlich weit über dem Thema dieses Buchs schwebt. Es lohnt sich trotzdem, einen genaueren Blick darauf zu werfen. In diese Kategorie fallen Module und Erweiterungen, die in einem gewissen Sinn Ähnlichkeit mit den Hilfsmodulen im Stil von XML::RSS haben. In beiden Fällen ist man nicht mehr so sehr an allgemeinen XML-Lösungen interessiert, sondern widmet sich einem bestimmten Thema, insbesondere einem bestimmten Dokumentformat. Der Unterschied besteht darin, wie weit die Sicht des Programmierers vom rohen Datenfluß losgelöst wird. Hat man erst einmal genügend Abstraktionsschichten dazwischen geschaltet, spürt man von XML nichts mehr.

Das ist natürlich ein erlaubtes und vernünftiges Unterfangen; wenn wir zum Beispiel ein Programm schreiben wollten, das auf SOAP oder XML-RPC aufbaut, sind wir letzten Endes nicht mehr an XML interessiert. Für uns ist das eine Black Box – funktioniert sie, sind wir damit zufrieden. (Ein gutes Modul bietet uns übrigens in irgendeiner Form doch den Zugriff auf die rohen XML-Daten. Nur für den Fall ...)

Das Simple Object Access Protocol (SOAP) bietet uns Zugriff auf die geballte Macht objektorientierter Webservices.

Anmerkung: Trotz des Namens haben Webservices nicht zwangsläufig mit dem WWW zu tun. Ein Webservice ist im wesentlichen einfach ein Stück Software, das sich hinter einem URI versteckt, um dort auf Anfragen zu warten und sie mit einer mehr oder weniger sinnvollen Reaktion zu beantworten. Meist werden Webservices mit Hilfe eines der guten alten HTTP- oder Webserver implementiert. Neuerdings wird aber gerne darauf hingewiesen, daß ein Webservice zum Beispiel auch Zugriff auf persistente Objekte und deren zugehörige Methoden bieten kann (so daß ein Programmierer also Software einbauen kann, die auf einem fremden Server liegt, ohne daß dieser Fakt bemerkbar wäre).

Wir konstruieren und benutzen Objekte, deren Klassendefinitionen am anderen Ende eines URIs sitzen. Selbst die am anderen Ende sitzende Programmiersprache ist beliebig, denn das Protokoll transformiert die zugehörigen Objektmethoden automatisch in eine standardisierte und XML-basierte API. Solange die betreffende Klasse sauber dokumentiert ist, kann man sie so behandeln, als wäre sie von einer Datei auf der lokalen Festplatte implementiert. Das setzt insbesondere die detaillierte Kenntnis der Klassen- und Instanzmethoden voraus, es kommt also wirklich auf die Dokumentation an.

An diesem Punkt kann man schwerlich übersehen, daß wir mit XML arbeiten. Zumindest im Fall von RSS entsprechen die Methodennamen der Objektschnittstelle mehr oder weniger denen des zugrunde liegenden XML-Dokuments. Wir gehen aber weiter und wollen mit diesem schrecklichen, für Maschinen unlesbaren Dokument gar nichts mehr zu tun haben.

Der Name SOAP::Lite bezieht sich auf den für die Benutzung dieses Moduls anfallenden Aufwand, nicht auf ein irgendein Gewicht. Wenn man das Modul auf dem eigenen System installiert, erstellt es eine lange Liste von Perl-Modulen, die ab jetzt bereit stehen. Einige dieser Module stehen verschiedenen Transportprotokollen zur Verfügung.

Anmerkung: HTTP ist die übliche Variante, SOAP-Objekte zu übertragen. Prinzipiell kann man aber auch gerne rohes TCP, SMTP oder Jabber einsetzen. SOAP::Lite macht bei allem mit.

So assistiert mod_perl bei der Implementierung von Webservices mit SOAPy. Auch eine große Menge von Dokumentation und Beispielen steht bereit. Als nächstes führt die Installation dasselbe mit einer Reihe von Modulen durch, die ähnliche Schnittstellen für XML-RPC, dem nicht objektorientierten Cousin von SOAP bereitstellen. SOAP::Lite ist eines jener Werkzeuge für Perl-Programmierer, das auf nahezu jeder Hochzeit tanzen kann. Für die Programmierung von Webservices ist es das, was CGI.pm für die Implementierung dynamischer Webseiten ist.

Gehen wir an die Arbeit und machen uns die Hände schmutzig, indem wir sie in Seife (Soap) tauchen.

Erstes Beispiel: Umrechnung von Temperaturen

Jedes Buch über Programmierung muß irgendwo ein Beispiel zur Temperaturumrechnung enthalten, oder? (Das ist für Europäer schwer verständlich. Die durch Grad Fahrenheit und Celsius in den USA angerichtete Verwirrung läßt sich am ehesten mit den Schwierigkeiten vergleichen, sich innerlich auf den Euro umzustellen.) Wir haben bis jetzt noch keines. In diesem Beispiel, das wir aus der SYNOPSIS der SOAP::Lite-Dokumentation geklaut haben, schreiben wir ein Programm mit einer Funktion namens f2c.  

use SOAP::Lite;
print SOAP::Lite
  -> uri('http://www.soaplite.com/Temperatures')
  -> proxy('http://services.soaplite.com/temper.cgi')
  -> f2c(32)
  -> result;

Die Ausführung dieses Programms als Perl-Skript ergibt die korrekte Antwort: 0. (Das setzt natürlich voraus, daß SOAP::Lite auf Ihrer Maschine installiert ist.)

Zweites Beispiel: Nachschlagen von ISBN-Nummern

Dieses Beispiel, das ein kleines Modul vom persönlichen Webserver des Autors einsetzt, ist etwas objektorientierter. Als Eingabe erhält es eine ISBN-Nummer. Das Ergebnis ist ein XML-Dokument im Format des Dublin Core mit passenden Büchern:

my ($isbn_number) = @ARGV;
use SOAP::Lite +autodispatch=>
   uri=>'http://www.jmac.org/ISBN',
   proxy=>'http://www.jmac.org/projects/bookdb/isbn/lookup.pl';
my $isbn_obj = ISBN->new;

# Die Methode 'get_dc' ruft Informationen im Format des Dublin Core ab
my $result = $isbn_obj->get_dc($isbn_number);

Der Witz in diesem Fall ist das Laden des Moduls ISBN.pm von der Maschine des Servers. Das Modul ist an und für sich nichts besonderes. Es handelt sich dabei um ein ganz normales Perl-Modul, das man auch bequem auf der lokalen Maschine mit use ISBN laden könnte, vorausgesetzt, man verfügt über eine lokale Kopie. Mit anderen Worten, das obige Programm ist äquivalent zu dem folgenden:

my ($isbn_number) = @ARGV;
use ISBN; # Diese Zeile ersetzt das obige 'use SOAP::Lite'.
my $isbn_obj = ISBN->new;

# Die Methode 'get_dc' ruft Informationen im Format des Dublin Core ab
my $result = $isbn_obj->get_dc($isbn_number);

Durch den Aufruf von SOAP::Lite und ein paar magischen Beschwörungsformeln, die im wesentlichen dafür sorgen, daß der richtige Server mit dem richtigen URI gefunden wird, sparen wir uns die lokale Kopie des Perl-Moduls. Trotzdem kommen wir in den Genuß der bereitgestellten API. Falls wir auf den ketzerischen Gedanken kämen, das Modul letzten Endes zu ersetzen, würde das vermutlich unbemerkt bleiben, sofern wir das Interface intakt ließen. In der von einer konkreten Programmiersprache abhängigen Welt der Webservices ist das alles, was zählt.

Was das Ganze mit XML zu tun hat? Um das zu zeigen, drehen wir an einem Ventil und geben den rohen Daten freien Lauf. Schauen wir uns an, was der Klassenkonstruktor von ISBN tatsächlich liefert, wenn wir die Option outputxml aktivieren:

my ($isbn_number) = @ARGV;
use SOAP::Lite +autodispatch=>
   uri=>'http://www.jmac.org/ISBN', outputxml=>1,
   proxy=>'http://www.jmac.org/projects/bookdb/isbn/lookup.pl';
my $isbn_xml = ISBN->new;
print "$isbn_xml\n";

Das Ergebnis wird in etwa so aussehen:

<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENC="http://schemas.
xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/
encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://
www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema" xmlns:
namesp1="http://www.jmac.org/ISBN"><SOAP-ENV:Body><namesp2:newResponse xmlns:
namesp2="http://www.jmac.org/ISBN"><ISBN xsi:type="namesp1:ISBN"/></namesp2:newResponse>
</SOAP-ENV:Body></SOAP-ENV:Envelope>

Das zweite Beispiel mußte etwas abgekürzt werden. Wir konnten die Methode get_dc nicht mehr aufrufen, weil wir durch die Aktivierung von outputxml als Ergebnis des Konstruktors kein Objekt mehr erhalten, sondern einen skalaren String. Wir haben diesen String mit den XML-Daten per print ausgegeben. Auch dieses Problem läßt sich umgehen, indem wir den XML-String in die magische Klasse SOAP::Deserializer stecken, die aus dem XML wieder ein Objekt macht:

# Wir setzen das vorige Beispiel fort...
my $deserial = SOAP::Deserializer->new;
my $isbn_obj = $deserial->deserialize($isbn_xml);
# Jetzt könnten wir den fehlenden Rest aus dem ersten Beispiel übernehmen.

Mit ein wenig zusätzlichem Aufwand bekommen wir also sowohl die rohen XML-Daten als auch die Black Box eines SOAP::Lite-Objekts. Sie können sich vielleicht vorstellen, daß dieses Feature Anwendungen ermöglicht, die weit über das Thema dieses Buchs hinausgehen. Umgekehrt eröffnet die Möglichkeit des Zugriffs auf das rohe XML auch alle möglichen Fehlerquellen.

Das Perl-Modul SOAP::Lite ist in verschiedener Hinsicht Zauberei. SOAP an und für sich ist nichts dergleichen, sondern eben ein Protokoll. Ein Protokoll und Dokumentformat mit merkwürdigen Namensräumen, Elementen und Attributen, wie wir sie in dem von SOAP::Lite erzeugten XML-Dokument sehen konnten. Das Dokument entspricht dabei der öffentlich zugänglichen SOAP-Spezifikation (Version 1.2).

Diese Konformität zur Spezifikation erlaubt sehr trickreiche Dinge. Zum Beispiel könnte eine SOAP-basierte Anwendung mit SOAP::Lite arbeiten und dieses Modul seine üblichen Spielereien treiben lassen. An irgendeinem Punkt könnte sich die Anwendung einschalten, das rohe XML bearbeiten (jede der Methoden, die wir in diesem Buch kennengelernt haben, ist dazu geeignet) und dann wieder an SOAP::Lite für die Weiterverarbeitung geben.

Die Benutzung von SOAP::Lite benötigt meist keinen Fingerbreit Kenntnisse im Umgang mit XML und Perl. Die meisten Anwendungen werden mit dem gebotenen Leistungsumfang völlig zufrieden sein. Aber es ist gut, beliebige Freiheiten zu haben. Wissen ist Macht. In diesem Fall ist es das Wissen über Perl und XML.

Damit beenden wir die Übersicht über Perl/XML-basierte Anwendungen. Als nächstes wollen wir Strategien zur Implementierung eigener Anwendungen vorstellen.

  

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Perl & XML bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © 2003 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Perl & XML" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de