Zum Inhalt springen

„SOAP“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[ungesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
Keine Bearbeitungszusammenfassung
Arbeiten mit SOAP: Diskussion:SOAP#Anwendungen (vor über 3 Jahren) + WP:Belege (insb. Grundsätze 1 u. 3)
 
(316 dazwischenliegende Versionen von mehr als 100 Benutzern, die nicht angezeigt werden)
Zeile 1: Zeile 1:
{{Dieser Artikel|beschäftigt sich mit dem Internet-Protokoll. Für weitere Bedeutungen siehe [[Soap]].}}
{{Dieser Artikel|beschäftigt sich mit dem Internet-Protokoll. Für weitere Bedeutungen siehe [[Soap]].}}
{{Netzwerk-TCP-IP-Anwendungsprotokoll2|SOAP|A1=Hypertext Transfer Protocol{{!}}HTTP|A2=Hypertext Transfer Protocol Secure{{!}}HTTPS}}
'''SOAP''' (ursprünglich für ''Simple Object Access Protocol'') ist ein [[Netzwerkprotokoll]], mit dessen Hilfe [[Daten]] zwischen [[System]]en ausgetauscht und [[Remote Procedure Call]]s durchgeführt werden können. SOAP ist ein industrieller Standard des [[World Wide Web Consortium]]s (W3C).


SOAP stützt sich auf [[Extensible Markup Language|XML]] zur Repräsentation der Daten und auf [[Internetprotokollfamilie|Internet-Protokolle]] der [[OSI-Modell#Schicht 4 – Transportschicht (Transport Layer)|Transport-]] und [[OSI-Modell#Schicht 7 – Anwendungsschicht (Application Layer)|Anwendungsschicht]] (vgl. [[TCP/IP-Referenzmodell]]) zur [[Datenübertragung|Übertragung]] der [[Nachricht]]en. Die gängigste Kombination ist SOAP über [[Hypertext Transfer Protocol|HTTP]] und [[Transmission Control Protocol|TCP]]. SOAP kann beispielsweise auch über [[SMTP]]<ref>[http://www.w3.org/TR/soap12-email en: SOAP Version 1.2 Email Binding]</ref> oder [[Java Message Service|JMS]]<ref>[http://www.w3.org/TR/soapjms/ en:SOAP over Java Message Service 1.0]</ref> verwendet werden. Die mit der Nachricht übermittelten [[Nutzdaten]] müssen nicht zwingend in XML gesendet werden, andere Formate wie [[Base64]] oder [[CSV (Dateiformat)|CSV]] sind auch möglich.<ref>[http://www.w3.org/TR/soap12-part1/#soapenv en:SOAP Message Construct]</ref><ref>[http://msdn.microsoft.com/en-us/library/aa302293.aspx en:XmlCsvReader Implementation]</ref> Die Abkürzung SOAP wird offiziell ab Version 1.2 nicht mehr als [[Akronym]] gebraucht, da es erstens (subjektiv) keineswegs einfach ''(Simple)'' ist und zweitens nicht nur dem Zugriff auf [[Objekt (Programmierung)|Objekte]] ''(Object Access)'' dient.
{| border="0" cellspacing="3" div style="float:right;padding-left:30px"
|+ '''SOAP im [[TCP/IP-Referenzmodell|TCP/IP-Protokollstapel]]'''
|-----
| colspan="5" align="center" bgcolor="#FFFFFF" |
|-----
| rowspan="2" align="center" bgcolor="#FFCC99" | '''Anwendung'''
| colspan="4" align="center" bgcolor="#9999FF" | '''SOAP'''
|-----
| colspan="2" align="center" bgcolor="#9999FF" | '''[[HTTP]]'''
| colspan="1arschficken alta" align="center" bgcolor="#9999FF" | '''[[HTTPS]]'''
| colspan="1" align="center" bgcolor="#9999FF" | '''...'''
|-----
| align="center" bgcolor="#FFCC99" | ''Transport''
| colspan="4" align="center" bgcolor="#9999FF" | '''[[Transmission Control Protocol|TCP]]'''
|-----
| rowspan="1" align="center" bgcolor="#FFCC99" | ''Netzwerk''
| colspan="4" align="center" bgcolor="#9999FF" | '''[[Internet Protocol|IP]]'''
|-----
| rowspan="2" align="center" bgcolor="#FFEEBB" | ''Netzzugang''
| rowspan="2" align="center" bgcolor="#EEEEEE" | [[Ethernet]]
| rowspan="2" align="center" bgcolor="#EEEEEE" | [[Token Ring|Token<br>Ring]]
| rowspan="2" align="center" bgcolor="#EEEEEE" | [[FDDI]]
| rowspan="2" align="center" bgcolor="#EEEEEE" | ...
|}


== Geschichte ==
'''SOAP''' (ursprünglich für ''Simple Object Access Protocol'') ist ein [[Netzwerkprotokoll|Protokoll]], mit dessen Hilfe [[Daten]] zwischen [[System]]en ausgetauscht und [[Remote Procedure Call]]s durchgeführt werden können. SOAP stützt sich auf die [[Dienst]]e anderer [[Standard]]s, [[XML]] zur [[Repräsentation]] der Daten und [[Internet-Protokoll-Familie|Internet-Protokolle]] der [[OSI-Modell#Schicht_4_Transportschicht|Transport-]] und [[OSI-Modell#Schicht_7_Anwendungsschicht|Anwendungsschicht]] (vgl. [[TCP/IP-Referenzmodell]]) zur [[Übertragung]] der [[Nachricht]]en. Die gängigste Kombination ist SOAP über [[HTTP]] und [[Transmission Control Protocol|TCP]]. Die Abkürzung SOAP wird jedoch offiziell seit Version 1.2 nicht mehr als Abkürzung gebraucht, da es erstens keineswegs einfach (Simple) ist und da es zweitens nicht (nur) dem Zugriff auf [[Objekt (Informatik)|Objekte]] (Object Access) dient.
[[Dave Winer]] (der „Vater“ von [[RSS (Web-Feed)|RSS]] 2.0) und [[Microsoft]] entwickelten 1998 die Spezifikation für [[XML-RPC]]. Als Weiterentwicklung daraus entstand SOAP, das Ende 1999 in Version 0.9 veröffentlicht wurde. Die Reaktion der [[Softwareentwickler|Entwickler]] war jedoch noch sehr zurückhaltend. Später im Jahr 1999 wurde die Version 1.0 veröffentlicht. Das war der Zeitpunkt, an dem die [[Software-Entwicklung|Entwicklung]] mehr Unterstützung fand. Dies kann man vor allem daran erkennen, dass sich [[IBM]] im Jahr 2000 der Entwicklung von SOAP anschloss, was dazu führte, dass IBM, Microsoft, DevelopMentor (Don Box) und UserLand Software (Dave Winer) die Spezifikation von SOAP 1.1 beim [[World Wide Web Consortium]] (W3C) einreichten. <!--(siehe [http://www-106.ibm.com/developerworks/library/ws-ref1.html James Snell – Reflections on SOAP] (englisch)) -->
Dabei wurde das Ziel verfolgt, eine [[Arbeitsgruppe]] anzustoßen, die SOAP weiterentwickeln sollte. Das Ergebnis dieser Arbeitsgruppe ist SOAP Version 1.2, die im Juni 2003 als Empfehlung ({{enS|recommendation}}) anerkannt wurde. Eine wichtige Änderung war, dass SOAP seither kein [[Akronym]] mehr ist, da sämtliche Deutungen für ''SOAP'', wie ''Simple Object Access Protocol'' oder ''Service Oriented Architecture Protocol'', den vollständigen Sinn von SOAP nicht treffen. Dadurch, dass SOAP nicht mehr als gebräuchliche Abkürzung verstanden wird, wurde es möglich, SOAP als Markennamen in den USA anzumelden.


== Geschichtlicher Abriss ==
== Arbeitsweise ==
SOAP ist ein Protokoll zum Austausch [[XML Information Set|XML-Information-Set]]-basierter Nachrichten über ein [[Rechnernetz]] und hat den Status einer [[W3C]]-Empfehlung. Es stellt Regeln für das Nachrichtendesign auf. Es regelt, wie Daten in der Nachricht abzubilden und zu interpretieren sind, und gibt eine Konvention für [[Remote Procedure Call|entfernte Prozeduraufrufe]] mittels SOAP-Nachrichten vor. SOAP macht keine Vorschriften zur [[Semantik]] applikationsspezifischer Daten, die versendet werden sollen, sondern stellt ein Rahmenwerk ''([[framework]])'' zur Verfügung, welches erlaubt, dass beliebige applikationsspezifische Informationen übertragen werden können. SOAP wird für entfernte Prozeduraufrufe ebenso genutzt wie für einfache Nachrichtensysteme beziehungsweise zum [[Datenaustausch]]. Zum Senden von Nachrichten können beliebige [[Transportprotokoll]]e verwendet werden, beispielsweise [[File Transfer Protocol|FTP]], [[SMTP]], [[HTTP]] oder auch [[Java Message Service|JMS]]. In der Praxis wird aufgrund der Kompatibilität mit gängigen Netzwerk-Architekturen (wie Firewalls) meist auf HTTP zurückgegriffen. Auch ist mittels [[Hypertext Transfer Protocol Secure|HTTPS]] die verschlüsselte Übertragung von SOAP-Nachrichten möglich. Das ermöglicht jedoch keine End-to-End-Verschlüsselung. Diese wird durch [[WS-Security]] ermöglicht, das auf der Ebene der Nachrichten und nicht auf der Ebene des unterliegenden Transportprotokolls ansetzt. Das XML Information Set der SOAP-Anfrage wird bei Nutzung von HTTP(S) im Body eines [[Hypertext Transfer Protocol#HTTP POST|HTTP POST Requests]] als XML an eine gegebene URL geschickt.
Ursprünglich wurde SOAP durch [[Dave Winer]] (den "Vater" von [[RSS]] 2.0) und [[Microsoft]] entwickelt, ein erstes [[Produkt (Wirtschaft)|Produkt]] aus dieser [[Zusammenarbeit]] ist [[XML-RPC]]. Das Ziel war jedoch SOAP, das zum ersten Mal Ende [[1999]] mit der Unterstützung durch [[Don Box]] veröffentlicht wurde. Damals war die Version 0.9 aktuell, die Reaktion der [[Software-Entwickler|Entwickler]] jedoch noch sehr zurückhaltend. Später im Jahr 1999 wurde die Version 1.0 veröffentlicht. Das war der Zeitpunkt, an dem die [[Software-Entwicklung|Entwicklung]] mehr Unterstützung fand. Dies kann man vor allem daran erkennen, dass sich die Firma [[IBM]] im Jahr [[2000]] der Entwicklung von SOAP anschloss, was dazu führte, dass IBM, Microsoft, [[DevelopMentor]] (Don Box) und [[UserLand]] Software (Dave Winer) die Spezifikation von SOAP 1.1 beim [[World Wide Web Consortium]] (W3C) einreichten. <!--(siehe [http://www-106.ibm.com/developerworks/library/ws-ref1.html James Snell - Reflections on SOAP (englisch)]) -->
Dabei wurde das Ziel verfolgt eine [[Arbeitsgruppe]] anzustoßen, die SOAP weiterentwickeln sollte. Das Ergebnis dieser Arbeitsgruppe ist SOAP Version 1.2, die im Juni [[2003]] als Empfehlungsvorschlag anerkannt wurde. Eine wichtige Änderung war, dass SOAP seither keine Abkürzung mehr ist, da sämtliche Deutungen für ''SOAP'', wie "Simple Object Access Protocol" oder "Service Oriented Architecture Protocol", den vollständigen Sinn von SOAP nicht treffen. Zudem ist es so möglich, SOAP als [[Name]]n in den USA anzumelden, eine Abkürzung könnte nicht geschützt werden.


SOAP wird regelmäßig dort eingesetzt, wo der direkte Zugang fremder Systeme zu einer Informationsquelle nicht sinnvoll erscheint. Dies kann an Kompatibilitätsproblemen zwischen verschiedenen [[Architektur (Informatik)|Anwendungsarchitekturen]] liegen, aber auch an Sicherheitsaspekten. So kann der (partielle) Zugriff auf eine Datenbank ermöglicht werden, ohne dass dem Anwenderprogramm der direkte Zugang gestattet werden muss. Über die SOAP-Schnittstelle kann die Menge der ausführbaren Methoden reglementiert und definiert werden.
== Struktur einer SOAP-Nachricht ==
Eine SOAP-Nachricht ist nach dem Head-Body-[[Design Pattern|Pattern]] modelliert. Ein SOAP-Envelope ist ein Container, der ein (optionales) Header-Element und ein Body-Element enthält. Weiterhin wird hier der verwendete Namensraum festgelegt.


Die Kommunikation mit SOAP ermöglicht die Kopplung von Systemen, der offene Entwurf von SOAP ermöglicht jedoch lediglich den Aufbau [[Lose Kopplung|schwach gekoppelter]] Systeme. Die Flexibilität des Konzeptes wird durch Nachteile in Übertragungsvolumen und [[Rechenaufwand]] erkauft. Das XML-Dokument muss beim Sender zunächst aufgebaut und anschließend validiert werden. Das Konzept verfolgt das Ziel eines leichtgewichtigen Protokolls, aufgrund des flexiblen Einsatzbereiches führt die zu übertragende Datei jedoch eine Reihe von [[Metadaten]] mit sich, die bei der Konstruktion des XML-Dokuments hinzugefügt werden. So führt beispielsweise das einfache Versenden von „Wahr“ oder „Falsch“ zu einem Datenvolumen von mehreren hundert Bytes, obwohl in einem stark gekoppelten System theoretisch ein Bit reichen würde. Durch die Möglichkeit des flexiblen Aufbaus des Dokuments können jedoch komplexe Transaktionen in einer Anfrage [[Atomare Operation|atomar]] zusammengefasst werden, während in stark gekoppelten Systemen hierzu oftmals mehrere Anfragen gestellt werden müssen. Dies verbessert das Nutzlastverhältnis (Nutzdaten zu Meta-Daten) und den Kommunikationsaufwand (für den Aufbau einer Verbindung, nur ein Senden/Empfangen).
Im Head-Bereich der Nachricht werden die [[Metainformation]]en der Nachricht untergebracht. Diese können [[Information]]en über das [[Routing]] der Nachricht, über eine eventuelle [[Verschlüsselung]] und / oder über die Zugehörigkeit zu einer [[Transaktion]] umfassen.


SOAP unterscheidet zwischen dem endgültigen Empfänger und Zwischenempfängern. Dies ermöglicht es, eine Nachricht über verschiedene „Hops“ zu schicken, bei denen sogar verschiedene Transportprotokolle verwendet werden. Beispielsweise kann zum ersten Hop die Nachricht mittels [[Java Message Service]] geschickt werden, danach über E-Mail und schließlich dem Empfänger mittels HTTP. Der Absender muss über die Zwischenhops keine Information haben, die Middleware jedoch schon.
Im Body der Nachricht sind, wie auch bei [[HTML]], die [[Nutzdaten]] untergebracht. Diese Daten müssen vom [[Empfänger]] der Nachricht interpretiert werden, mögliche Zwischenstationen können diese auch ignorieren. Die Daten können dabei unter anderem für entfernte Methodenaufrufe, (Fehler-)Meldungen oder reine Daten (z.&nbsp;B. Abbildung einer Klassenstruktur) stehen.


== Aufbau von SOAP-Nachrichten ==
Anschließend können mögliche Anhänge folgen, diese werden abhängig von dem Transportprotokoll an die Nachricht angehängt. Binärdateien (Sound, Video, Grafik etc.) können durch Nutzung von [[Multipurpose Internet Mail Extensions|MIME]]-Mechanismen angebunden werden.
[[Datei:SOAP.svg|mini|SOAP-Struktur]]
Eine minimale SOAP-Nachricht besteht aus einem ''Envelope'' genannten Element, welchem ein lokaler Name zugewiesen werden muss. Dieses Element referenziert mittels eines Namensraum-Attributes auf <code><nowiki>http://www.w3.org/2003/05/soap-envelope</nowiki></code>. Kind dieses Elements muss ein ''Body''-Element sein. Optional kann zuvor ein ''Header''-Element stehen. In diesem können Meta-Informationen, beispielsweise zum Routing, zur Verschlüsselung oder zu Transaktionsidentifizierung, untergebracht werden. Im ''Body''-Element sind die eigentlichen Nutzdaten untergebracht.


== Beispielablauf einer SOAP-Kommunikation ==
''Struktur einer SOAP-Nachricht:''
<syntaxhighlight lang="xml">
<?xml version="1.0"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Header>
</s:Header>
<s:Body>
</s:Body>
</s:Envelope>
</syntaxhighlight>


Innerhalb des ''Body''-Elements können sowohl Informationen zum Datenaustausch, als auch Anweisungen für einen entfernten Prozeduraufruf stehen. Dies ist vom Empfänger entsprechend zu interpretieren.
Angenommen es existiert ein [[Webservice]] mit dem Namen "CardValidator" zum Validieren von [[Kreditkarte]]n, der, vereinfacht gesagt, nur eine Kreditkartennummer und das Gültigkeitsdatum der Karte erwartet. Der Server würde dann mit "true" oder "false" antworten – je nachdem, ob die Kartendaten gültig sind oder nicht.


Im Header wird der nächste Hop (intermediary) und der endgültige Empfänger (ultimate recipient) angegeben.<ref>[http://www.w3.org/TR/soap12-part0/#L1244 en: SOAP Processing Model]</ref> Ein intermediary kann beispielsweise die Nachricht verschlüsseln, sie loggen oder die Nachricht aufteilen. Ersteres erlaubt es, dass die Anwendungslogik sich nicht um die Sicherheit der Nachricht kümmern muss, sondern dies die Middleware übernimmt. Die Möglichkeit, dass Intermediaries beliebige Dinge tun können, ermöglicht [[Enterprise Application Integration]] beispielsweise mit den EAI Patterns von [[Gregor Hohpe]] und Bobby Woolf<ref>[http://www.eaipatterns.com/ en:Patterns and Best Practices for Enterprise Integration]</ref>.
Eine gültige Kreditkartennummer sei 1234 5678 9876 5432 und diese Karte sei bis 12/08 (Dezember 2008) gültig. Bei unserem Beispiel-[[Webservice]] würde die Methode ''validate'' auf dem Server aufgerufen, um die Überprüfung durchzuführen. Es könnte folgender [[Datenaustausch]] zwischen [[Client]] und [[Server]] stattfinden:


== Arbeiten mit SOAP ==
SOAP-Anfrage vom Client (ohne HTTP-Header):
SOAP wird zur Datenbankabfrage über eine Internet-Schnittstelle genutzt. Im Folgenden soll über eine Internet-Schnittstelle bei einer zentralen Datenbank nachgefragt werden, ob dort eine Arbeit mit dem Titel „DOM, SAX und SOAP“ vorliegt, und diese gegebenenfalls zurückgegeben werden. Diese Datenbank stellt hierzu die Methode „TitleInDatabase“ zur Verfügung, die den Titel als Eingabe verlangt. Eine Anfrage könnte dann wie folgt aussehen:


<syntaxhighlight lang="xml">
<code>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0"?>
<soapenv:Envelope xmlns:soapenv="<nowiki>http://schemas.xmlsoap.org/soap/envelope/</nowiki>"
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Body>
xmlns:xsd="<nowiki>http://www.w3.org/2001/XMLSchema</nowiki>"
xmlns:xsi="<nowiki>http://www.w3.org/2001/XMLSchema-instance</nowiki>">
<m:TitleInDatabase xmlns:m="http://www.lecture-db.de/soap">
DOM, SAX und SOAP
<soapenv:Body>
</m:TitleInDatabase>
<ns1:validate soapenv:encodingStyle="<nowiki>http://schemas.xmlsoap.org/soap/encoding/</nowiki>"
</s:Body>
xmlns:ns1="urn:CardValidator">
</s:Envelope>
<number xsi:type="xsd:string">1234 5678 9876 5432</number>
</syntaxhighlight>
<valid xsi:type="xsd:string">12/08</valid>
</ns1:validate>
</soapenv:Body>
</soapenv:Envelope>
</code>


Diese SOAP-Anfrage enthält kein ''Header''-Element. Das Element „TitleInDatabase“ ist nicht Teil der SOAP-Definition, sondern anwendungsspezifisch. Der Server empfängt die Nachricht und wertet sie aus. Dabei kann zum Einlesen der Nachricht sowohl [[Simple API for XML|SAX]] als auch [[Document Object Model|DOM]] verwendet werden. In diesem Fall mag sich ein SAX-Parser empfehlen, der auf „startElement("TitleInDatabase", […])“ eine entsprechende Datenbankabfrage aufruft, deren Eingabewert beim nächsten „character-Ereignis“ eingelesen wird. So kann eine Parallelität zwischen dem Einlesen und dem Auswerten der Nachricht erreicht werden.
SOAP-Antwort vom Server (ohne HTTP-Header):
Anschließend wird in diesem Beispiel eine SOAP-Nachricht als Antwort zurückgegeben:


<syntaxhighlight lang="xml">
<code>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0"?>
<soapenv:Envelope xmlns:soapenv="<nowiki>http://schemas.xmlsoap.org/soap/envelope/</nowiki>"
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Header>
xmlns:xsd="<nowiki>http://www.w3.org/2001/XMLSchema</nowiki>"
xmlns:xsi="<nowiki>http://www.w3.org/2001/XMLSchema-instance</nowiki>">
<m:RequestID xmlns:m="http://www.lecture-db.de/soap">a3f5c109b</m:RequestID>
<soapenv:Body>
</s:Header>
<s:Body>
<ns1:validateResponse soapenv:encodingStyle="<nowiki>http://schemas.xmlsoap.org/soap/encoding/</nowiki>"
xmlns:ns1="urn:CardValidator">
<m:DbResponse xmlns:m="http://www.lecture-db.de/soap">
<m:title value="DOM, SAX und SOAP">
<addReturn xsi:type="xsd:boolean">true</addReturn>
<m:Choice value="1">Arbeitsbericht Informatik</m:Choice>
</ns1:validateResponse>
<m:Choice value="2">Seminar XML und Datenbanken</m:Choice>
</soapenv:Body>
</soapenv:Envelope>
</m:title>
</m:DbResponse>
</code>
</s:Body>
</s:Envelope>
</syntaxhighlight>


Der Server hat seiner Antwort ein ''Header''-Element angehängt, welches in diesem Beispiel die Anfragekennung zurückliefert. Die angefragte Information findet sich wiederum im ''Body'' der Nachricht. In diesem Fall wurden zwei Arbeiten gefunden und dem anfragenden System zurückgesendet. Dies führt im Folgenden zu einer wechselseitigen Kommunikation, einem dialogorientierten Austausch von XML-Dokumenten mittels SOAP, an deren Ende schließlich die Übermittlung des angeforderten Elements stehen wird.
== Nachteile von SOAP ==

An diesem einfachen Beispiel wird bereits deutlich, dass SOAP die Menge der zu übertragenden Daten erheblich (ca. Faktor 25 beim Request und Faktor &gt;500 bei der Antwort) aufbläht. Dies ist nicht nur ein Problem der beanspruchten Netzwerkbandbreite, auch das Generieren und Auswerten (Parsen) der Nachrichten erfordert sehr viel Rechenzeit, verglichen mit anderen, einfacheren RPC-Protokollen.

== Aussicht ==

Als Transportschicht diente früher ausschließlich HTTP. In den heutigen Implementierungen ist die Transportschicht aber weitgehend abstrahiert und lässt sich fast beliebig austauschen. Neuere Erweiterungen betreffen den Bereich des Transports von binären Daten. Außerdem entstehen viele nützliche Tools zur Entwicklung von SOAP-Clients, aber auch von Serveranwendungen für das Bereitstellen (Deployment) und Managen, resp. Überwachen, der Dienste (Applikationsserver).


== Implementierungen ==
== Implementierungen ==
* [[Apache CXF]] (Fortführung von [[XFire (Framework)|Codehaus XFire]]), [[Apache Axis]] ([[Jakarta EE]]), mSOAP, kSOAP und [[Java API for XML Web Services]] API für [[Java (Programmiersprache)|Java]]
*[[Apache SOAP]], [[Apache Axis]] (J2EE)
* AWS Web Development [[Framework]]
*[[Microsoft .NET]] (.NET)
* [[Curl (Programmiersprache)|Curl]] package in CURL.XML.SOAP
*[[PHP Extension and Application Repository|PEAR]] SOAP-Projekt (PHP)
*SOAP für [[Ruby (Programmiersprache)|Ruby]]
* cSOAP und gSOAP für [[C (Programmiersprache)|C]]/[[C++]]
* PHP:SOAP, nuSOAP und [[PHP Extension and Application Repository|PEAR]] SOAP-Projekt für [[PHP]]
*SOAP für [[Perl]]
* Python SOAP, ZSI, SOAPpy, SUDS und Zeep sind SOAP-Bibliotheken für [[Python (Programmiersprache)|Python]]
*SOAP für [[PHP]]5
*cSOAP und gSOAP für [[C (Programmiersprache)|C]]/[[C++]]
* SOAP::WSDL [[Open Source|Open-Source]]-Toolkit für [[Perl (Programmiersprache)|Perl]]
*SOAP für [[Tcl]]
* SOAP für VisualWorks Smalltalk
* WebMethods GLUE
*SOAP für VisualWorks Smalltalk
*SOAP für [[Python (Programmiersprache)|Python]]
* SOAP4R und Savon für [[Ruby (Programmiersprache)|Ruby]]
* TCLSOAP<ref>[http://sourceforge.net/projects/tclsoap/files/tclsoap/ TclSOAP]</ref> für die Skriptsprache [[Tcl]]
*WebMethods GLUE
* [[4th Dimension]]
* Qt Soap Teil der Solutions (Add-on) der [[Qt (Bibliothek)|Qt-Bibliothek]]
* KDSOAP Qt4/5 native Library mit einem Konverter von WSDL nach C++/Qt
* FEAST Ein Client-Server-Framework für die [[Qt (Bibliothek)|Qt-Bibliothek]]
* wsdl2objc [[Open Source|Open-Source]]-Toolkit für [[Objective-C]]
* [[.NET Framework]] 2.0: Zu Serialisierungszwecken in System.Runtime.Serialization.Formatters.Soap, System.Web.Services
* .NET Framework 3.x/4.x: [[Windows Communication Foundation|WCF]], System.Web.Services


== Auf SOAP basierende Erweiterungen ==
== Auf SOAP basierende Erweiterungen ==
*[[WS-Reliability]] (Web Services Reliability): Sicherheitsmechanismen um z.&nbsp;B. Transaktionen verlässlich abwickeln zu können ([http://docs.oasis-open.org/wsrm/ws-reliability/v1.1/wsrm-ws_reliability-1.1-spec-os.pdf]).
* [[WS-Reliability]] (Web Services Reliability): Sicherheitsmechanismen, um z.&nbsp;B. Transaktionen verlässlich abwickeln zu können<ref>([http://docs.oasis-open.org/wsrm/ws-reliability/v1.1/wsrm-ws_reliability-1.1-spec-os.pdf Web Services Reliable Messaging TC WS-Reliability 1.1])</ref>
*[[WS-Security]] (Web Services Security): Sicherstellen von Integrität und Vertraulichkeit von Nachrichten ([http://www-128.ibm.com/developerworks/webservices/library/ws-secure/]).
* [[WS-Security]] (Web Services Security): Sicherstellen von Integrität und Vertraulichkeit von Nachrichten<ref>({{Webarchiv | url=http://www.ibm.com/developerworks/library/specification/ws-secure/ | wayback=20120916113514 | text=Web Services Security}})</ref>
*[[WSRP]] (Web Services for Remote Portlets): Integration von Präsentationslogik in Portale ([http://www.oasis-open.org/committees/download.php/3343/oasis-200304-wsrp-specification-1.0.pdf])
* [[WSRP]] (Web Services for Remote Portlets): Integration von Präsentationslogik in Portale<ref>([http://www.oasis-open.org/committees/download.php/3343/oasis-200304-wsrp-specification-1.0.pdf Web Services for Remote Portlets Specification])</ref>
* weitere Spezifikationen: [[WS-*]]
* [[TR-069]] CPE WAN Management Protokoll (CWMP)
* [[TR-069]] CPE WAN Management Protokoll (CWMP)


== Siehe auch ==
== Siehe auch ==
* [[Serviceorientierte Architektur]] (SOA) – auf SOAP oder ähnlichen Protokollen basierende Architektur
* [[UDDI]] (setzt auf SOAP auf; nutzt SOAP)
* [[Web Services Description Language|WSDL]] – Beschreibungssprache für auf SOAP-basierte Schnittstellen inkl. einer Nachrichten-Beschreibung
* [[SoapUI]] – Werkzeug für den Test von SOAP-Nachrichten
* [[Hessian (Webprotokoll)|Hessian]], [[Burlap]] – alternative Protokolle
* [[SOAP Message Transmission Optimization Mechanism|MTOM]] – Protokoll fürs Versenden von Binärdaten innerhalb von SOAP-Nachrichten
* [[SOAP with Attachments]] – [[W3C]]-Vorschlag für den Transport von SOAP-Nachrichten innerhalb von MIME-Nachrichten
* [[DSSP]] – ein auf SOAP basierendes Protokoll<ref>[http://download.microsoft.com/download/5/6/B/56B49917-65E8-494A-BB8C-3D49850DAAC1/DSSP.pdf Decentralized Software Services Protocol – DSSP/1.0]</ref> für das Microsoft Robotic Developer Studio


Ferner:
* [[Serviceorientierte Architektur]] (SOA)
* [[Representational State Transfer|REST]]
* [[UDDI]] (setzt auf SOAP auf / nutzt SOAP),
* [[Common Object Request Broker Architecture|CORBA]]
* [[WSDL]]
* [[CORBA]]
* [[Middleware]]
* [[Komponente (Software)]]
* [[Komponentenbasierte Entwicklung]]
* [[Internet Communications Engine]] (ICE)
* [[Universal Network Objects]]
* [[Universal Network Objects]]


== Weblinks ==
== Weblinks ==
*[http://www.w3.org/TR/SOAP/ W3C: Note zu SOAP 1.1] (englisch)
* [http://www.w3.org/TR/SOAP/ W3C: SOAP Specifications] (englisch)
*[http://www.w3.org/TR/soap12-part0/ W3C: SOAP 1.2 Teil 0: "Primer"] (englisch)
* [http://www.w3.org/2000/xp/ XML protocol activity] (englisch)
* [http://www.theserverside.de/webservice-in-java/ Beispiel für einen WebService mit Java/SOAP] Schritt-für-Schritt-Anleitung für die Implementation eines WebServices in Java mit SOAP (Stand: 2008, deutsch)
*[http://www.w3.org/TR/soap12-part1/ W3C: SOAP 1.2 Teil 1: "Messaging"] (englisch)
*[http://www.w3.org/TR/soap12-part2/ W3C: SOAP 1.2 Teil 2: "Adjuncts"] (englisch)
* [http://xml.coverpages.org/soap.html Technologiebericht] (englisch; xml.coverpages.org)
* [https://web.archive.org/web/20160706024316/http://www.schoenberg-solutions.de/dl/SOAP_SEC_060810.pdf Sicherheit für SOAP mit Tomcat und AXIS] (PDF; deutsch)
*[http://poseidon.home.tlink.de/w3c/REC-soap12-part0-20030624-de_DE/ W3C: SOAP 1.2 Teil 0: "Einführung"] (deutsch)

*[http://www.w3.org/2000/xp/ XML protocol activity] (englisch)
== Einzelnachweise ==
*[http://xml.coverpages.org/soap.html Technologiebericht] (englisch; xml.coverpages.org)
<references />


{{NaviBlock
[[Kategorie:Netzwerkprotokoll auf Anwendungsschicht]]
|Navigationsleiste W3C-Standards
[[Kategorie:Middleware|SOAP]]
|Navigationsleiste Webserver-Schnittstellen
}}


{{SORTIERUNG:Soap}}
[[en:SOAP]]
[[Kategorie:Internet-Anwendungsprotokoll]]
[[eo:SOAP]]
[[es:SOAP]]
[[Kategorie:Middleware]]
[[Kategorie:Webservice]]
[[fa:پروتکل دسترسی آسان به اشیاء]]
[[Kategorie:XML-basierte Sprache]]
[[fr:Simple object access protocol]]
[[he:SOAP]]
[[Kategorie:Abkürzung]]
[[id:SOAP]]
[[it:SOAP]]
[[ja:Simple Object Access Protocol]]
[[nl:Simple Object Access Protocol]]
[[pl:Simple Object Access Protocol]]
[[pt:SOAP]]
[[ru:SOAP]]
[[sv:SOAP]]
[[zh:SOAP]]

Aktuelle Version vom 9. Oktober 2024, 13:26 Uhr

SOAP im TCP/IP-Protokollstapel:
Anwendung SOAP
HTTP HTTPS
Transport TCP
Internet IP (IPv4, IPv6)
Netzzugang Ethernet Token
Bus
Token
Ring
FDDI

SOAP (ursprünglich für Simple Object Access Protocol) ist ein Netzwerkprotokoll, mit dessen Hilfe Daten zwischen Systemen ausgetauscht und Remote Procedure Calls durchgeführt werden können. SOAP ist ein industrieller Standard des World Wide Web Consortiums (W3C).

SOAP stützt sich auf XML zur Repräsentation der Daten und auf Internet-Protokolle der Transport- und Anwendungsschicht (vgl. TCP/IP-Referenzmodell) zur Übertragung der Nachrichten. Die gängigste Kombination ist SOAP über HTTP und TCP. SOAP kann beispielsweise auch über SMTP[1] oder JMS[2] verwendet werden. Die mit der Nachricht übermittelten Nutzdaten müssen nicht zwingend in XML gesendet werden, andere Formate wie Base64 oder CSV sind auch möglich.[3][4] Die Abkürzung SOAP wird offiziell ab Version 1.2 nicht mehr als Akronym gebraucht, da es erstens (subjektiv) keineswegs einfach (Simple) ist und zweitens nicht nur dem Zugriff auf Objekte (Object Access) dient.

Dave Winer (der „Vater“ von RSS 2.0) und Microsoft entwickelten 1998 die Spezifikation für XML-RPC. Als Weiterentwicklung daraus entstand SOAP, das Ende 1999 in Version 0.9 veröffentlicht wurde. Die Reaktion der Entwickler war jedoch noch sehr zurückhaltend. Später im Jahr 1999 wurde die Version 1.0 veröffentlicht. Das war der Zeitpunkt, an dem die Entwicklung mehr Unterstützung fand. Dies kann man vor allem daran erkennen, dass sich IBM im Jahr 2000 der Entwicklung von SOAP anschloss, was dazu führte, dass IBM, Microsoft, DevelopMentor (Don Box) und UserLand Software (Dave Winer) die Spezifikation von SOAP 1.1 beim World Wide Web Consortium (W3C) einreichten. Dabei wurde das Ziel verfolgt, eine Arbeitsgruppe anzustoßen, die SOAP weiterentwickeln sollte. Das Ergebnis dieser Arbeitsgruppe ist SOAP Version 1.2, die im Juni 2003 als Empfehlung (englisch recommendation) anerkannt wurde. Eine wichtige Änderung war, dass SOAP seither kein Akronym mehr ist, da sämtliche Deutungen für SOAP, wie Simple Object Access Protocol oder Service Oriented Architecture Protocol, den vollständigen Sinn von SOAP nicht treffen. Dadurch, dass SOAP nicht mehr als gebräuchliche Abkürzung verstanden wird, wurde es möglich, SOAP als Markennamen in den USA anzumelden.

SOAP ist ein Protokoll zum Austausch XML-Information-Set-basierter Nachrichten über ein Rechnernetz und hat den Status einer W3C-Empfehlung. Es stellt Regeln für das Nachrichtendesign auf. Es regelt, wie Daten in der Nachricht abzubilden und zu interpretieren sind, und gibt eine Konvention für entfernte Prozeduraufrufe mittels SOAP-Nachrichten vor. SOAP macht keine Vorschriften zur Semantik applikationsspezifischer Daten, die versendet werden sollen, sondern stellt ein Rahmenwerk (framework) zur Verfügung, welches erlaubt, dass beliebige applikationsspezifische Informationen übertragen werden können. SOAP wird für entfernte Prozeduraufrufe ebenso genutzt wie für einfache Nachrichtensysteme beziehungsweise zum Datenaustausch. Zum Senden von Nachrichten können beliebige Transportprotokolle verwendet werden, beispielsweise FTP, SMTP, HTTP oder auch JMS. In der Praxis wird aufgrund der Kompatibilität mit gängigen Netzwerk-Architekturen (wie Firewalls) meist auf HTTP zurückgegriffen. Auch ist mittels HTTPS die verschlüsselte Übertragung von SOAP-Nachrichten möglich. Das ermöglicht jedoch keine End-to-End-Verschlüsselung. Diese wird durch WS-Security ermöglicht, das auf der Ebene der Nachrichten und nicht auf der Ebene des unterliegenden Transportprotokolls ansetzt. Das XML Information Set der SOAP-Anfrage wird bei Nutzung von HTTP(S) im Body eines HTTP POST Requests als XML an eine gegebene URL geschickt.

SOAP wird regelmäßig dort eingesetzt, wo der direkte Zugang fremder Systeme zu einer Informationsquelle nicht sinnvoll erscheint. Dies kann an Kompatibilitätsproblemen zwischen verschiedenen Anwendungsarchitekturen liegen, aber auch an Sicherheitsaspekten. So kann der (partielle) Zugriff auf eine Datenbank ermöglicht werden, ohne dass dem Anwenderprogramm der direkte Zugang gestattet werden muss. Über die SOAP-Schnittstelle kann die Menge der ausführbaren Methoden reglementiert und definiert werden.

Die Kommunikation mit SOAP ermöglicht die Kopplung von Systemen, der offene Entwurf von SOAP ermöglicht jedoch lediglich den Aufbau schwach gekoppelter Systeme. Die Flexibilität des Konzeptes wird durch Nachteile in Übertragungsvolumen und Rechenaufwand erkauft. Das XML-Dokument muss beim Sender zunächst aufgebaut und anschließend validiert werden. Das Konzept verfolgt das Ziel eines leichtgewichtigen Protokolls, aufgrund des flexiblen Einsatzbereiches führt die zu übertragende Datei jedoch eine Reihe von Metadaten mit sich, die bei der Konstruktion des XML-Dokuments hinzugefügt werden. So führt beispielsweise das einfache Versenden von „Wahr“ oder „Falsch“ zu einem Datenvolumen von mehreren hundert Bytes, obwohl in einem stark gekoppelten System theoretisch ein Bit reichen würde. Durch die Möglichkeit des flexiblen Aufbaus des Dokuments können jedoch komplexe Transaktionen in einer Anfrage atomar zusammengefasst werden, während in stark gekoppelten Systemen hierzu oftmals mehrere Anfragen gestellt werden müssen. Dies verbessert das Nutzlastverhältnis (Nutzdaten zu Meta-Daten) und den Kommunikationsaufwand (für den Aufbau einer Verbindung, nur ein Senden/Empfangen).

SOAP unterscheidet zwischen dem endgültigen Empfänger und Zwischenempfängern. Dies ermöglicht es, eine Nachricht über verschiedene „Hops“ zu schicken, bei denen sogar verschiedene Transportprotokolle verwendet werden. Beispielsweise kann zum ersten Hop die Nachricht mittels Java Message Service geschickt werden, danach über E-Mail und schließlich dem Empfänger mittels HTTP. Der Absender muss über die Zwischenhops keine Information haben, die Middleware jedoch schon.

Aufbau von SOAP-Nachrichten

[Bearbeiten | Quelltext bearbeiten]
SOAP-Struktur

Eine minimale SOAP-Nachricht besteht aus einem Envelope genannten Element, welchem ein lokaler Name zugewiesen werden muss. Dieses Element referenziert mittels eines Namensraum-Attributes auf http://www.w3.org/2003/05/soap-envelope. Kind dieses Elements muss ein Body-Element sein. Optional kann zuvor ein Header-Element stehen. In diesem können Meta-Informationen, beispielsweise zum Routing, zur Verschlüsselung oder zu Transaktionsidentifizierung, untergebracht werden. Im Body-Element sind die eigentlichen Nutzdaten untergebracht.

Struktur einer SOAP-Nachricht:

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
    <s:Header>
    </s:Header>
    <s:Body>
    </s:Body>
</s:Envelope>

Innerhalb des Body-Elements können sowohl Informationen zum Datenaustausch, als auch Anweisungen für einen entfernten Prozeduraufruf stehen. Dies ist vom Empfänger entsprechend zu interpretieren.

Im Header wird der nächste Hop (intermediary) und der endgültige Empfänger (ultimate recipient) angegeben.[5] Ein intermediary kann beispielsweise die Nachricht verschlüsseln, sie loggen oder die Nachricht aufteilen. Ersteres erlaubt es, dass die Anwendungslogik sich nicht um die Sicherheit der Nachricht kümmern muss, sondern dies die Middleware übernimmt. Die Möglichkeit, dass Intermediaries beliebige Dinge tun können, ermöglicht Enterprise Application Integration beispielsweise mit den EAI Patterns von Gregor Hohpe und Bobby Woolf[6].

Arbeiten mit SOAP

[Bearbeiten | Quelltext bearbeiten]

SOAP wird zur Datenbankabfrage über eine Internet-Schnittstelle genutzt. Im Folgenden soll über eine Internet-Schnittstelle bei einer zentralen Datenbank nachgefragt werden, ob dort eine Arbeit mit dem Titel „DOM, SAX und SOAP“ vorliegt, und diese gegebenenfalls zurückgegeben werden. Diese Datenbank stellt hierzu die Methode „TitleInDatabase“ zur Verfügung, die den Titel als Eingabe verlangt. Eine Anfrage könnte dann wie folgt aussehen:

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
    <s:Body>
        <m:TitleInDatabase xmlns:m="http://www.lecture-db.de/soap">
            DOM, SAX und SOAP
        </m:TitleInDatabase>
    </s:Body>
</s:Envelope>

Diese SOAP-Anfrage enthält kein Header-Element. Das Element „TitleInDatabase“ ist nicht Teil der SOAP-Definition, sondern anwendungsspezifisch. Der Server empfängt die Nachricht und wertet sie aus. Dabei kann zum Einlesen der Nachricht sowohl SAX als auch DOM verwendet werden. In diesem Fall mag sich ein SAX-Parser empfehlen, der auf „startElement("TitleInDatabase", […])“ eine entsprechende Datenbankabfrage aufruft, deren Eingabewert beim nächsten „character-Ereignis“ eingelesen wird. So kann eine Parallelität zwischen dem Einlesen und dem Auswerten der Nachricht erreicht werden. Anschließend wird in diesem Beispiel eine SOAP-Nachricht als Antwort zurückgegeben:

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
    <s:Header>
        <m:RequestID xmlns:m="http://www.lecture-db.de/soap">a3f5c109b</m:RequestID>
    </s:Header>
    <s:Body>
        <m:DbResponse xmlns:m="http://www.lecture-db.de/soap">
            <m:title value="DOM, SAX und SOAP">
                <m:Choice value="1">Arbeitsbericht Informatik</m:Choice>
                <m:Choice value="2">Seminar XML und Datenbanken</m:Choice>
            </m:title>
        </m:DbResponse>
    </s:Body>
</s:Envelope>

Der Server hat seiner Antwort ein Header-Element angehängt, welches in diesem Beispiel die Anfragekennung zurückliefert. Die angefragte Information findet sich wiederum im Body der Nachricht. In diesem Fall wurden zwei Arbeiten gefunden und dem anfragenden System zurückgesendet. Dies führt im Folgenden zu einer wechselseitigen Kommunikation, einem dialogorientierten Austausch von XML-Dokumenten mittels SOAP, an deren Ende schließlich die Übermittlung des angeforderten Elements stehen wird.

Implementierungen

[Bearbeiten | Quelltext bearbeiten]

Auf SOAP basierende Erweiterungen

[Bearbeiten | Quelltext bearbeiten]
  • WS-Reliability (Web Services Reliability): Sicherheitsmechanismen, um z. B. Transaktionen verlässlich abwickeln zu können[8]
  • WS-Security (Web Services Security): Sicherstellen von Integrität und Vertraulichkeit von Nachrichten[9]
  • WSRP (Web Services for Remote Portlets): Integration von Präsentationslogik in Portale[10]
  • weitere Spezifikationen: WS-*
  • TR-069 CPE WAN Management Protokoll (CWMP)
  • Serviceorientierte Architektur (SOA) – auf SOAP oder ähnlichen Protokollen basierende Architektur
  • UDDI (setzt auf SOAP auf; nutzt SOAP)
  • WSDL – Beschreibungssprache für auf SOAP-basierte Schnittstellen inkl. einer Nachrichten-Beschreibung
  • SoapUI – Werkzeug für den Test von SOAP-Nachrichten
  • Hessian, Burlap – alternative Protokolle
  • MTOM – Protokoll fürs Versenden von Binärdaten innerhalb von SOAP-Nachrichten
  • SOAP with AttachmentsW3C-Vorschlag für den Transport von SOAP-Nachrichten innerhalb von MIME-Nachrichten
  • DSSP – ein auf SOAP basierendes Protokoll[11] für das Microsoft Robotic Developer Studio

Ferner:

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. en: SOAP Version 1.2 Email Binding
  2. en:SOAP over Java Message Service 1.0
  3. en:SOAP Message Construct
  4. en:XmlCsvReader Implementation
  5. en: SOAP Processing Model
  6. en:Patterns and Best Practices for Enterprise Integration
  7. TclSOAP
  8. (Web Services Reliable Messaging TC WS-Reliability 1.1)
  9. (Web Services Security (Memento vom 16. September 2012 im Internet Archive))
  10. (Web Services for Remote Portlets Specification)
  11. Decentralized Software Services Protocol – DSSP/1.0