September 2006


Mit diesem Tutorial wollen wir uns mal sozusagen dem Internet hinter dem Internet zuwenden, den Bereich, den man nicht zu sehen bekommt, der aber für den Bereich e-commerce mittlerweile von fundamentaler Bedeutung ist: Webservices.

Was ist das? Ein Webservice stellt Informationen, einen Service, zur Verfügung. Dies ist nicht unbedingt so spannend aber dieser Service agiert nicht direkt mit einem Menschen sondern wird normalerweise von einer Software angesprochen. Die Maschinen sprechen sozusagen automatisiert untereinander. Das hört sich auf jeden Fall schon einmal viel spannender an!

Zur weiteren Vertiefung der Theorie, sei unbedingt auf den Wikipedia-Artikel verwiesen. Insbesondere das Schaubild zur Funktionsweise sollte man sich vor Augen halten.

Wir wollen beispielhaft jetzt einen Beitrag für eine serviceorientierte Architektur (SOA) leisten.


Dazu nehmen wir PHP und XML-RPC. PHP sticht in dem Bereich der SOA nicht unbedingt als die Sprache der 1. Wahl hervor. Meist wird hier Java oder C# verwendet, die Mechanismen sind aber auch in PHP vorhanden. Zur Kommunikation benutzen wir XML-RPC.

XML-RPC bedeutet "XML-Remote-Procedure-Call" und erlaubt die Kommunikation, bzw. den Methodenaufruf, über Software auf verschiedenen Systemen, unter verschiedenen Umgebungen zu kommunizieren. Der gemeinsame Nenner ist ein TCP/IP-basiertes Netzwerk. Die Methodik ist in vielen Programmiersprachen implementiert. Das bedeutet, dass der Anbieter eines Service nicht in der gleichen Sprache erstellt sein muss wie der Konsument.
Den gemeinsamen Nenner des TCP/IP-basierten Netzwerk, muss man noch etwas einschränken: Der Aufruf der entfernten Methoden erfolgt über HTTP. Die Rückgabe der Methode ist dann in intern XML verpackt, wobei dort folgenden Datentypen vorhanden sein können:

  • int, double, boolean, String, DateTime-iso8601, Base64-String (ByteStrom)

Wenn man genauere Ergebnisse benötigt, kann man die Resultate auch in eine Struktur (struct) packen. Ein Struct ist ähnlich einem Hash. Er besitzt einen Key (Typ String) und ein Value (beliebiger oben genannter Datentyp).

Soweit zur Theorie… Bevor die Praxis folgt, sollte man sich folgendes Bild am besten ausdrucken und neben die Tastatur legen. Das Schaubild verdeutlicht die generelle Funktionsweise von XML-RPC (spezialisiert) unter PHP und es wird immer wieder auf das Schaubild zur Erklärung des Code verwiesen.
Bild: xmlRPC.png

Zur Funktionsweise müssen wir noch sicherstellen, dass wir das PEAR-Package XML_RPC benutzen können.

 

Beispiel: Wir implementieren eine Suchfunktion für Mitarbeiter.

Um das Beispiel nicht zu komplex werden zu lassen, kann nur nach dem Ort eines Mitarbeiters gesucht werden.

1. Schritt: Eine Mitarbeiter-Datenbank aufbauen.
Wir implementieren eine rudimentäre Mitarbeiter-Datenbank in MySQL.
Datenbank-Skript mitarbeiter.sql.txt

2. Schritt: Aufbau einer Abfragemaske
Die Abfragemaske wird sehr minimal aufgebaut. Sie stellt nur eine einfache Eingabemöglichkeit dar, einen Ortsnamen einzugeben. Dieser Ortsname wird an den XML-RPC Client übergeben (siehe Bild).
Datei: gui.php

3. Entgegenname der Suchanfrage durch den XML-RPC Client
Zuallerst müssen wir im Client durch einen include sicherstellen, dass wir das PEAR-Package eingebunden haben. Danach packen wir den empfangenen Wert in die Variable $ort.
Jetzt sollten wir uns das Bild wieder zu Hilfe nehmen. Die Variable $ort wird in ein XML_RPC_Value verpackt ($para1) mit der entsprechenden Typ-Angabe (string).
Anschließend muss dieses XML_RPC_Value in ein PHP-Array gepackt werden ($parameterArray) , welches in eine XML_RPC_Message gepackt wird ($nachricht). Der erste Parameter für XML_RPC_Message ist hierbei der Name, der externen Funktion. D.h. der Name der nach außen vom Service her sichtbar ist. Intern kann dieser Name komplett anders heißen. Dazu aber später…
Wir benötigen jetzt eine Instanz vom Typ XML_RPC_Client ($xmlrpc) und übergeben hier den URL-Pfad unter
der der Service erreichbar ist, den Host und den Port. Über diese Instanz, können wir jetzt unsere Nachricht ($nachricht) an den Service verschicken und erhalten das Ergebnis in der Variable $response. In der folgenden If-Bedingung wird das Ergebnis dann entpackt und kann genutzt werden. Wir entpacken hier in die Variable $ergebnis und übergeben das Ergebnis als Get-Parameter an die gui.php zurück.
Datei: client.php

4. Der Service antwortet
Der Service muss als Erstes das PEAR Server Package für XML-RPC inkludieren. Im nächsten Schritt wird eine Instanz vom Typ XML_RPC_Server gebildet. Dieser Instanz wird ein mehrdimensionales Array übergeben. In diesem Array ist ein Array pro Funktion enthalten welches folgende Angaben hat:
Name der Servicefunktion für extern (holeMitarbeiter) als Key, dann bis zu drei Werte in einem Array und zwar der interne Funktionsname und optional docstring und signature. docstring enthält eine Beschreibung, signature gibt den Rückgabewert an und den Typ der zu übergebenden Parameter.
Hier ist also extern der Funktionsname "holeMitarbeiter" sichtbar, der intern auf die Funktion "ichHole" weiterverweist.
In ichHole wird der Übergabeparameter weiterverarbeitet. Die Variable heißt hier $hasen, der Name spielt absolut keine Rolle. in $hasen ist der vom Client verpackte XML_RPC_Value, der in ein PHP-Array gesteckt wurde. Dieser wird hier wieder entpackt und steht uns dann als Variable $ort für die SQL-Abfrage zur Verfügung.
Nachdem die SQL-Abfrage durchgeführt wurde, packen wir die einzelnen Werte in XML_RPC_Values, diese wiederum in ein PHP-Array, welches ebenfalls in ein XML_RPC_Value vom Typ "Struct" gepackt wird ($RPC_ergebnis). $RPC_Ergebnis wird in eine XML_RPC_Response gepackt und ist der Rückgabewert der Funktion.
Datei: server.php

Das wars soweit! Ich hoffe, das Ganze war soweit einigermaßen verständlich und noch nachvollziehbar. Verwiesen werden sollte noch auf die XML_RPC Dokumentation auf der PEAR-Seite: http://pear.php.net/package/XML_RPC/docs/latest/

Zur Vorbereitung meiner Abschlußprüfung, war ich gerade dabei, mich der Thematik AJAX zuzuwenden. Die Erstellung der notwendigen XML-Daten geschah im Unterricht in PHP. Warum auch nicht, das Prinzip soll in erster Linie erklärt werden und PHP-Code ist doch recht schnell zu erstellen.
Habe mich dann aber doch irgendwie in den Gedanken vertieft, mein XML mit Perl zu fabrizieren… Und es hat mich überrascht wie schnell es mir von der Hand ging ohne eine besonders große Einarbeitungszeit. Benutzt habe ich dazu das Modul XML::Writer.
Im nächsten Schritt habe ich versucht eine mehr oder wenig sinnige Aufgabenstellung im AJAX-Kontext umzusetzen: Alle 10 Sekunden erscheint auf einer Website an einer definierten Stelle ein neuer Banner. Die Bannerdaten sollten natürlich von meinem Perl-Skript in wohlgeformten XML geliefert werden. Das Resultat in Perl:


#!/usr/bin/perl
use strict;
use warnings;
# use DBI; # DB-Connectivity wäre hier wohl das eigentliche Einsatzgebiet
use XML::Writer;

my @banner = ("http://192.168.0.2/test/js1/banner/eins.jpg",
   "http://192.168.0.2/test/js1/banner/zwei.jpg",
   "http://192.168.0.2/test/js1/banner/drei.jpg");
my @url = ("http://www.heise.de", "http://www.golem.de", "http://blog.wilkening.info");

# Wir machen eine Browserausgabe also den
# Content-Type und vor allem den doppelten
# Zeilenumbruch nicht vergessen
print "Content-Type: text/xml\n\n";

my $output = "";

# XML geht in die Variable $output.
my $writer = new XML::Writer(OUTPUT => $output);
$writer->setDataIndent(3);

$writer->startTag('Banner');
# Abarbeiten des Array
for (my $i=0; $i< @banner;$i++)
{
   $writer->startTag(’EinBanner’, ID=>$i); # Attribute werden einfach “angehängt”
      $writer->startTag(’bild’);
      $writer->characters($banner[$i]);
      $writer->endTag(’bild’);
      $writer->startTag(’uri’);
      $writer->characters($url[$i]);
      $writer->endTag(’uri’);
   $writer->endTag(’EinBanner’);
}
$writer->endTag(’Banner’);

$writer->end();

Ich finde den Code wirklich simpel aber erkläre noch einmal kurz wichtige Dinge:

  1. use XML::Writer; -> Einbindung des Modul
  2. Die Arrays @banner und @url enthalten die eigentlichen Daten. So etwas kommt normalerweise meist aus einer DB…
  3. print “Content-Type: text/xml\n\n”; -> Auf den konnte ich bei meinen Versuchen nicht verzichten…
  4. my $writer = new XML::Writer(OUTPUT => $output); -> Instanz eines Objekt vom Typ XML:Writer
  5. $writer->startTag(’Banner’); -> Setzen eines Elements, eines Tags. Hier das Root-Element
  6. $writer->endTag(’Banner’); -> Schließen eines Knotens
  7. “Banner” ist das Root-Element. Dazwischen folgen die weiteren Knoten, die in der For-Schleife gebildet werden. Hierbei sollte man noch einmal ein Augenmerk darauf werfen, wie Attribute gebildet werden:
    $writer->startTag(’EinBanner’, ID=>$i); # Attribute werden einfach “angehängt”.
    Der Inhalt der Elemente wird mit $writer->characters($banner[$i]); geschrieben
  8. $writer->end(); -> FERTIG

Die Ausgabe der XML-Datei sieht wie folgt aus:

<Banner>
   <EinBanner ID="0">
      <bild>http://192.168.0.2/test/js1/banner/eins.jpg</bild>
      <uri>http://www.heise.de</uri>
   </EinBanner>
   <EinBanner ID="1">
      <bild>http://192.168.0.2/test/js1/banner/zwei.jpg</bild>
      <uri>http://www.golem.de</uri>
   </EinBanner>
   <EinBanner ID="2">
      <bild>http://192.168.0.2/test/js1/banner/drei.jpg</bild>
      <uri>http://blog.wilkening.info</uri>
   </EinBanner>
</Banner>

Vesalia Computer - Keyrah

Keyrah macht die Tastaturen von klassischen Computern auch für neuere Computer nutzbar. Die Platine wird einfach in das Gehäuse eines Commodore 8-Bit-Computers gesteckt.

e-commerce-blog.de: News, Trends und Informationen aus E-Commerce, Online Marketing und Online Verkaufsförderung - 79 deutsche Shopsysteme

Um Niemanden auf die Füsse zu treten haben wir auf eine Kategorisierung oder Bewertung bewusst verzichtet.

Ja aber warum listet man dann 79 Shopsysteme auf? Um eine Liste der Liste halber zu haben?

*heul* Die Web 2.0 kompatible Schurkenstaat-Hymne wird für Klingeltöne mißbraucht. Zeit, sich nach was anderem umzuschauen…

Nachdem ich durch externe Hilfe noch auf ein paar Fehler aufmerksam gemacht wurde, den Code mit “use strict” verbessert habe und nun auch noch die Punkte Unterprogramme und “Here-Document” mit aufgeführt habe, sollte “Perl in einer Stunde” soweit erst einmal fertig sein.

Download: “Perl in einer Stunde”

« Previous Page