Ankündigung

Einklappen
Keine Ankündigung bisher.

4,32: Seifenopern

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • 4,32: Seifenopern

    4,32:
    Zitat von Fight Club – Tyler Durden (Brad Pitt)
    "Seife! – Bitte? – Ich mache und verkaufe Seife! Das Eichmaß der Zivilisation!"
    Nun, die Seife um die es im heutigen Türchen geht, war hier sicher nicht gemeint. Wir wollen uns nun SOAP anschauen. Ursprünglich stand SOAP einmal für Simple Object Access Protocol. Die diese Bezeichnung dem heutigen SOAP aber keineswegs mehr gerecht wird, ist SOAP mittlerweile zum Eigennamen geworden. SOAP wird eingesetzt zum Datenaustausch und zum ferngesteuertem Ausführen von Code.

    Im Zeitalter der globalen Vernetzung ist Kommunikation alles. Dazu finden sich im Internet haufenweise Standards und Protokolle. Allgemein wird SOAP als Protokoll bezeichnet, intern verwendet es aber einen eigenen Standard und bedient sich dem XML-Standard und dem HTTP-Protokoll. Grundsätzlich könnte die Nutzung von SOAP unter PHP also mit Curl und XML problemlos abgewickelt werden.

    In PHP 5 bietet uns die SOAP-Erweiterung aber einen wesentlich komfortableren Weg SOAP zu nutzen. Sowohl als Server um Anfragen entgegen zu nehmen, als auch als Client um ebendiese zu versenden. Mit der Erweiterung brauchen wir eigentlich gar kein XML mehr. In XAMPP steht uns die Erweiterung standardmäßig zur Verfügung, weshalb wir auf die Installation nicht weiter eingehen wollen.

    Der Server

    Wir möchten jetzt einen SOAP-Server erstellen, dieser soll den Clienten eine Funktion zur Verfügung stellen, die die Länge zweier Strings miteinander vergleicht.

    PHP-Code:
      function compare($str1,$str2){
          return (
    strlen($str1) === strlen($str2));
      }
      
      
    $server = new SoapServer(NULL, array('uri' => 'http://localhost/'));
      
    $server->addFunction('compare');
      
    $server->handle(); 
    Hier erstellen wir die o.g. Funktion, ein SoapServer Objekt und registrieren die Funktion. Mit handle() beenden wir den „Definitions-Modus“ und bringen den Server dazu, die ankommenden Anfragen entgegen zu nehmen. Das wars schon, wir haben nun einen SOAP-Server mit der gewollten Funktionalität.

    Beschreibung des Servers


    Unser Server ist nun voll funktionsfähig. Normalerweise gibt es für einen SOAP-Server aber eine WSDL-Datei, diese beschreibt den Server. Diese Beschreibung (im XML-Format) kann dann vom Client interpretiert werden. Er weiss dann welche Methoden auf dem Server zur Verfügung stehen, welche Parameter diese verlangen und welchen Typ von Rückgabe sie liefern. Eine WSDL-Datei für unseren Server würde wie folgt aussehen:

    Code:
    <?xml version ='1.0' encoding ='UTF-8' ?> 
    <definitions name='TestServer' 
      xmlns:tns=' http://limes2.dev/soap.wsdl' 
      xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' 
      xmlns:xsd='http://www.w3.org/2001/XMLSchema' 
      xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/' 
      xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' 
      xmlns='http://schemas.xmlsoap.org/wsdl/'> 
     
    <message name='compareRequest'> 
      <part name='str1' type='xsd:string'/>
      <part name='str2' type='xsd:string'/>
    </message> 
    <message name='compareResponse'> 
      <part name='Result' type='xsd:boolean'/> 
    </message> 
     
    <portType name='TestServerPortType'> 
      <operation name='compare'> 
        <input message='tns:compareRequest'/> 
        <output message='tns:compareResponse'/> 
      </operation> 
    </portType> 
     
    <binding name='TestServerBinding' type='tns:TestServerPortType'> 
      <soap:binding style='rpc' 
        transport='http://schemas.xmlsoap.org/soap/http'/> 
      <operation name='compare'> 
        <soap:operation soapAction='urn:xmethodsTestServer#compare'/> 
        <input> 
          <soap:body use='encoded' namespace='urn:xmethodsTestServer' 
            encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/> 
        </input> 
        <output> 
          <soap:body use='encoded' namespace='urn:xmethodsTestServer' 
            encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/> 
        </output> 
      </operation> 
    </binding> 
     
    <service name='TestServerService'> 
      <port name='TestServerPort' binding='TestServerBinding'> 
        <soap:address location='http://localhost/soapserver.php'/> 
      </port> 
    </service> 
    </definitions>
    Manch einer mag den Inhalt und Aufbau dieser Datei sofort verstehen, ein anderer kann hier nachlesen wie das ganze funktioniert.

    Der Client

    Zugegeben, es macht nicht viel Sinn den Client zu unserem Server auf derselben Maschine laufen zu haben, aber für unser Beispiel reicht es aus. Ihr müsst euch nur dazu denken, dass diese beiden Scripte von verschiedenen Systemen aus einfach via HTTP miteinander kommunizieren.

    Unser Client soll jetzt also die Methode „compare“ unseres Servers aufrufen. Generell könnten wir das ganze auch ohne die WSDL-Datei machen, mit dieser Datei ist es aber wesentlich komfortabler, denn wir müssen nichts weiter machen als folgenden Code zu schreiben:
    PHP-Code:
    $client = new SoapClient("http://localhost/soap.wsdl");
    $result $client->compare("hi","du");
    var_dump($result); // Ausgabe "boolean true" 
    Das war es schon! Wir sind jetzt in der Lage jeden SOAP-Server im Netz ohne Aufwand zu steuern. Außerdem können wir leicht einen eigenen Webservice anbieten.
Lädt...
X