Simple Object Access Protocol

Aus Mikiwiki
Version vom 7. Februar 2010, 15:24 Uhr von Michi (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Das Simple Object Access Protocol / SOAP ist ein Netzwerkprotokoll, mit dessen Hilfe Daten zwischen Systemen ausgetauscht und Remote Procedure Calls durchgeführt werden können. SOAP stützt sich auf die Dienste anderer Standards: XML zur Repräsentation der Daten und Internetprotokolle der Transport- und Anwendungsschicht zur Übertragung der Nachrichten. Die gängigste Kombination ist SOAP über HTTP und TCP.

Die Abkürzung SOAP wird offiziell seit Version 1.2 nicht mehr als Akronym gebraucht, da es erstens (subjektiv) keineswegs einfach (Simple) ist und da es zweitens nicht (nur) dem Zugriff auf Objekte (Object Access) dient.

Einführung

SOAP definiert ein XML-Protokoll, das meist im Körper einer HTTP-Nachricht versendet wird. HTTP geht vermutlich durch jede Firewall der Welt und ist damit der ideale Weg, wirklich jeden Server in das Netzwerk der Webservice-Teilnehmer einzubinden. Die in allen Plattformen und Sprachen verfügbaren Parser können das Format XML leicht lesen und die Daten so einfach zur Verfügung stellen, dass nur geringer Programmieraufwand anfällt. Der Prozess der Datenannahme und auch der Datenerzeugung lässt sich gut automatisieren. Das muss auch so sein, denn ohne eine automatische Weiterverarbeitung ist eine automatische Kommunikation sinnlos.

Das folgende Schema zeigt den grundsätzlichen Aufbau einer SOAP-Nachricht. Die Anzahl der Blöcke mit den Daten der Anfrage oder der Antwort ist beliebig.

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
                   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <SOAP-ENV:Header>
    :   :   :
  </SOAP-ENV:Header>
  <SOAP-ENV:Body>
    :   :   :
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Das Wurzelelement bildet der bereits erwähnte SOAP-Envelope. Der URI des Namensraums lautet immer "http://schemas.xmlsoap.org/soap/envelope/". Der Alias ist frei wählbar, wird jedoch standardmässig aif "SOAP-ENV" festgelegt. Als Namensraum wird unter anderem "xsd" verwendet, die XML Schema Definition Language. Die dort definierten Datentypen bilden damit die Grundlage der typstrengen Übermittlung von Daten zwischen den Kommunikationspartnern. Die beiden Namensräume für die Schema-Definition und die Schema-Instanz sollten hinzugefügt werden und müssen vorhanden sein, wenn die entsprechenden Datentypen verwendet werden. Schema-Instanz definiert komplexe Typen und Null in dieser Definition als "nil".

Der Kopf (SOAP-Header) der Nachricht ist optional, der Körper (SOAP-Body) muss immer vorhanden sein. DTD-Deklarationen sind grundsätzlich nicht zulässig. Der Körper enthält das eigentliche Dokument, das seinerseits nach den XML-Regeln wohlgeformt sein muss. Sonderzeichen oder binäre Daten sind durch "<[CDATA[...]>" zu schützen. Das ist auch die einzige Regel - SOAP selbst beachtet den Inhalt der Nachricht nicht. Die Azswertung der Daten ist Sache der beteiligten Prozessoren, also des selber geschriebenen Programms.

Die folgende Auflistung zeigt eine vollständige SOAP-Nachricht, im konkreten Fall eine Anfrage an den Suchdienst Google (ais dem Google-API-Paket).

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
                   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
                   xmlns:si="http://soapinterop.org/xsd"
                   xmlns:ns6="urn:GoogleSearch"
                   SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <SOAP-ENV:Body>
    <ns6:doGoogleSearch>
      <key        xsi:type="xsd:string">xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</key>
      <q          xsi:type="xsd:string">site:php.comzept.de XML</q>
      <start      xsi:type="xsd:int">0</start>
      <maxresults xsi:type="xsd:int">5</maxresults>
      <filter     xsi:type="xsd:boolean">false</filter>
      <restrict   xsi:type="xsd:string"></restrict>
      <safeSearch xsi:type="xsd:boolean">false</safeSearch>
      <lr         xsi:type="xsd:string"></lr>
      <ie         xsi:type="xsd:string"></ie>
      <oe         xsi:type="xsd:string"></oe>
    </ns6:doGoogleSearch>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Antworten werden ebenso in SOAP formuliert.

Der Umgang mit SOAP erscheint nicht besonders einfach. Trotz leistungsfähiger XML-Funktionen in .NET wäre einiger Programmieraufwand nötig, um die Nachrichten in jedem Fall genau zu formulieren und die Antweort entsprechend auszuwerten. Es wird vor allem problematisch, wenn der Anbieter die Struktur seines Dienstes ändert, denn dann muss das eigene Programm geändert oder sogar neu geschrieben werden. Da sich Anbieter und Konsument eines Webservices normalerweise nicht kennen, sind weitere Schritte hin zur praktischen Nutzbarkeit notwendig. Das Problem wird noch verschärft, wenn Anbieter und Konsument mit verschiedenen Systemen arbeiten, beispielsweise auf der Serverseite mit PHP und auf der Clientseite mit einer Windows-typischen Umgebung wie COM oder .NET. Abhilfe schafft die Sprache WSDL.

Weblinks

Herausgeber Sprache Webseitentitel Anmerkungen
World Wide Web Consortium eng Latest SOAP versionswbm
Wikipedia ger SOAPwbm Enzyklopädischer Artikel