<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>RL Design &#124; Blog</title>
	<atom:link href="http://blog.lamprecht-web.at/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.lamprecht-web.at</link>
	<description>Ein weiteres tolles WordPress-Blog</description>
	<lastBuildDate>Thu, 19 May 2011 22:00:36 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>RSS Feeds dynamisch erstellen</title>
		<link>http://blog.lamprecht-web.at/2010/05/rss-feed-dynamisch-erstellen/</link>
		<comments>http://blog.lamprecht-web.at/2010/05/rss-feed-dynamisch-erstellen/#comments</comments>
		<pubDate>Tue, 11 May 2010 20:22:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Code-Snippets]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Feed]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://blog.lamprecht-web.at/?p=9</guid>
		<description><![CDATA[RSS Feeds&#8230; kleine Helfer, die eine einfache Veröffentlichung von geänderten Inhalten auf Webseiten ermöglichen.
Folgendes Codebeispiel zeigt wie man mithilfe von PHP eine dynamische RSS 2.0 valide XML Datei erzeugen kann.


&#60;?php
function getLatestNews&#40;&#41;
&#123;
&#160; &#160; // &#8230;
&#160; &#160; // Liefert Inhalte aus einer Datenbank zurück. Diese werden als RSS Feeds aufbereitet. Die SQL Abfrage sollte zumindest den Namen, [...]]]></description>
			<content:encoded><![CDATA[<p>RSS Feeds&#8230; kleine Helfer, die eine einfache Veröffentlichung von geänderten Inhalten auf Webseiten ermöglichen.</p>
<p>Folgendes Codebeispiel zeigt wie man mithilfe von PHP eine dynamische RSS 2.0 valide XML Datei erzeugen kann.</p>
<p><span id="more-9"></span></p>
<div class="codesnip-container" >
<div class="php codesnip" style="font-family:monospace;"><span class="kw2">&lt;?php</span><br />
<span class="kw2">function</span> getLatestNews<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">// &#8230;</span><br />
&nbsp; &nbsp; <span class="co1">// Liefert Inhalte aus einer Datenbank zurück. Diese werden als RSS Feeds aufbereitet. Die SQL Abfrage sollte zumindest den Namen, eine Beschreibung sowie die Erstellungszeit beinhalten.</span><br />
<span class="br0">&#125;</span></p>
<p><a href="http://www.php.net/header"><span class="kw3">header</span></a><span class="br0">&#40;</span><span class="st0">&quot;Content-Type: application/rss+xml&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw1">echo</span> <span class="st_h">&#8216;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#8217;</span><span class="sy0">.</span><span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="sy0">;</span><br />
<span class="sy1">?&gt;</span><br />
&lt;rss version=&quot;2.0&quot; xmlns:atom=&quot;http://www.w3.org/2005/Atom&quot;&gt;<br />
&nbsp; &nbsp; &lt;channel&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;title&gt;RSS FEED TITEL&lt;/title&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;link&gt;http://your.domain.com&lt;/link&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;atom:link href=&quot;http://your.domain.com/rss.php&quot; rel=&quot;self&quot; type=&quot;application/rss+xml&quot; /&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;description&gt;FEED BESCHREIBUNG&lt;/description&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;language&gt;de-de&lt;/language&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;copyright&gt;COPYRIGHTINFO&lt;/copyright&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;pubDate&gt;<span class="kw2">&lt;?php</span> <span class="kw1">echo</span> <a href="http://www.php.net/date"><span class="kw3">date</span></a><span class="br0">&#40;</span><span class="st0">&quot;r&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span>&lt;/pubDate&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">&lt;?php</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$latestNews</span> <span class="sy0">=</span> getLatestNews<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$latestNews</span> <span class="kw1">as</span> <span class="re0">$ln</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">?&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;item&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">&lt;?php</span> <span class="co1">// Die Funktion utf8_encode() verwende ich um etwaigen Problemen mit der Kodierung vorzubeugen, da die in diesem Feed bereitgestellten Inhalte UTF8 codiert sein müssen. ?&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;title&gt;<span class="kw2">&lt;?php</span> <span class="kw1">echo</span> <a href="http://www.php.net/utf8_encode"><span class="kw3">utf8_encode</span></a><span class="br0">&#40;</span><span class="re0">$ln</span><span class="br0">&#91;</span><span class="st_h">&#8216;title&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span>&lt;/title&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;description&gt;<span class="kw2">&lt;?php</span> <span class="kw1">echo</span> <a href="http://www.php.net/utf8_encode"><span class="kw3">utf8_encode</span></a><span class="br0">&#40;</span><span class="re0">$ln</span><span class="br0">&#91;</span><span class="st_h">&#8216;description&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span>&lt;/description&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;link&gt;http://your.domain.com/link_zum_artikel&lt;/link&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;guid&gt;http://your.domain.com/link_zum_artikel&lt;/guid&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;pubDate&gt;<span class="kw2">&lt;?php</span> <span class="kw1">echo</span> <a href="http://www.php.net/date"><span class="kw3">date</span></a><span class="br0">&#40;</span><span class="st_h">&#8216;r&#8217;</span><span class="sy0">,</span> <a href="http://www.php.net/strtotime"><span class="kw3">strtotime</span></a><span class="br0">&#40;</span><span class="re0">$ln</span><span class="br0">&#91;</span><span class="st_h">&#8216;created_at&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span>&lt;/pubDate&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/item&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">&lt;?php</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">?&gt;</span><br />
&nbsp; &nbsp; &lt;/channel&gt;<br />
&lt;/rss&gt;</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.lamprecht-web.at/2010/05/rss-feed-dynamisch-erstellen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Webservices mit PHP</title>
		<link>http://blog.lamprecht-web.at/2010/05/webservices-mit-php/</link>
		<comments>http://blog.lamprecht-web.at/2010/05/webservices-mit-php/#comments</comments>
		<pubDate>Tue, 11 May 2010 19:42:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.lamprecht-web.at/?p=4</guid>
		<description><![CDATA[Ich hab vor kurzem begonnen mich mit Webservices für PHP zu beschäftigen. Nun gibt es eine Vielzahl von interessanten Artikeln zu diesem Thema. Allerdings geht kaum einer der Artikel darauf ein, wie man ganze PHP Klassen zur Verfügung stellen kann. In den meisten Fällen wird eine einzelne Funktion mit Hilfe der in PHP5 zur Verfügung [...]]]></description>
			<content:encoded><![CDATA[<p>Ich hab vor kurzem begonnen mich mit Webservices für PHP zu beschäftigen. Nun gibt es eine Vielzahl von interessanten Artikeln zu diesem Thema. Allerdings geht kaum einer der Artikel darauf ein, wie man ganze PHP Klassen zur Verfügung stellen kann. In den meisten Fällen wird eine einzelne Funktion mit Hilfe der in PHP5 zur Verfügung gestellten Funktion </p>
<div class="codesnip-container" >
<div class="php codesnip" style="font-family:monospace;"><span class="re0">$soapserver</span><span class="sy0">-&gt;</span><span class="me1">addFunction</span><span class="br0">&#40;</span><span class="st0">&quot;function&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<p>eingebunden.</p>
<p>Nun kann man in PHP als Alternative auch noch eine Klasse zur Verfügung stellen. Sämtliche darin enthaltene Methoden werden dem Webservice zur Verfügung gestellt und können von einem Client genutzt werden, so sie in der <a href="http://www.w3.org/TR/wsdl" target="_blank">WSDL</a> (Web Sevice Description Language) Datei beschrieben werden. Allerdings lässt sich mit dieser Methode nur eine Klasse einbinden. Auch kann die WSDL Datei bei Bereitstellung von vielen Methoden relativ schnell unübersichtlich werden. </p>
<p>Nach einigem herumprobieren habe ich eine Möglichkeit gefunden das Ganze skalierbarer und übersichtlicher zu gestalten.<br />
<span id="more-4"></span></p>
<p>Um einen generellen Einstieg in die Webservice Programmierung mit PHP zu erhalten ist dieser (englischsprachige) <a href="http://jimmyzimmerman.com/blog/2007/02/soap-server-with-php5-part-1.html" target="_blank">Blog Artikel</a> von JimmyZ sehr zu empfehlen. </p>
<h3>Die WSDL Datei</h3>
<p>Von dort habe ich auch die grundlegende Struktur für die hier verwendete WSDL Datei. WSDL ist eine Beschreibungssprache für Webservices. Mit ihr kann unter Anderem festgelegt werde mit welchem Server kommuniziert wird, welche Methoden von diesem bereitgestellt werden und welche Parameter übergeben und zurückgeliefert werden. </p>
<p>Der Aufbau einer solchen WSDL Datei mag zuerst etwas kompliziert erscheinen. In den meisten Fällen kann man aber die Grundstruktur einer einmal erstellten Datei wiederverwenden. So müssen nur Dinge wie die zur Verfügung gestellten Methoden und deren Paramter angepasst werden. </p>
<p>Eine WSDL Datei liest sich am Besten von unten nach oben. So ist es wesentlich einfacher die einzelnen Teile der Datei miteinander in Beziehung zu setzen. </p>
<p>Hier erst mal die verwendete WSDL Datei! Die einzelnen Teile erkläre ich dann anschließend. </p>
<div class="codesnip-container" >
<div class="xml codesnip" style="font-family:monospace;"><span class="sc3"><span class="re1">&lt;?xml</span> version =<span class="st0">&#8216;1.0&#8242;</span> encoding =<span class="st0">&#8216;UTF-8&#8242;</span> <span class="re2">?&gt;</span></span> <br />
<span class="sc3"><span class="re1">&lt;definitions</span></span><br />
<span class="sc3"> &nbsp;<span class="re0">targetNamespace</span>=<span class="st0">&#8216;urn:Soap_Server&#8217;</span></span><br />
<span class="sc3"> &nbsp;<span class="re0">xmlns:tns</span>=<span class="st0">&#8216;urn:Soap_Server&#8217;</span> </span><br />
<span class="sc3"> &nbsp;<span class="re0">xmlns:soap</span>=<span class="st0">&#8216;http://schemas.xmlsoap.org/wsdl/soap/&#8217;</span> </span><br />
<span class="sc3"> &nbsp;<span class="re0">xmlns:xsd</span>=<span class="st0">&#8216;http://www.w3.org/2001/XMLSchema&#8217;</span> </span><br />
<span class="sc3"> &nbsp;<span class="re0">xmlns:soapenc</span>=<span class="st0">&#8216;http://schemas.xmlsoap.org/soap/encoding/&#8217;</span> </span><br />
<span class="sc3"> &nbsp;<span class="re0">xmlns:wsdl</span>=<span class="st0">&#8216;http://schemas.xmlsoap.org/wsdl/&#8217;</span> </span><br />
<span class="sc3"> &nbsp;<span class="re0">xmlns</span>=<span class="st0">&#8216;http://schemas.xmlsoap.org/wsdl/&#8217;</span><span class="re2">&gt;</span></span> </p>
<p><span class="sc3"><span class="re1">&lt;types<span class="re2">&gt;</span></span></span><br />
&nbsp; <span class="sc3"><span class="re1">&lt;schema</span> <span class="re0">targetNamespace</span>=<span class="st0">&quot;urn:Soap_Server&quot;</span> <span class="re0">xmlns</span>=<span class="st0">&quot;http://www.w3.org/2001/XMLSchema&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;import</span> <span class="re0">namespace</span>=<span class="st0">&quot;http://schemas.xmlsoap.org/soap/encoding/&quot;</span> <span class="re0">schemaLocation</span>=<span class="st0">&quot;http://schemas.xmlsoap.org/soap/encoding/&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;complexType</span> <span class="re0">name</span>=<span class="st0">&quot;FixedArray&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;complexContent<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;restriction</span> <span class="re0">base</span>=<span class="st0">&quot;soapenc:Array&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;attribute</span> <span class="re0">ref</span>=<span class="st0">&quot;soapenc:arrayType&quot;</span> <span class="re0">wsdl:arrayType</span>=<span class="st0">&quot;xsd:anyType[]&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;/restriction<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/complexContent<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;/complexType<span class="re2">&gt;</span></span></span><br />
&nbsp; <span class="sc3"><span class="re1">&lt;/schema<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/types<span class="re2">&gt;</span></span></span></p>
<p><span class="sc3"><span class="re1">&lt;message</span> <span class="re0">name</span>=<span class="st0">&#8216;callRequest&#8217;</span><span class="re2">&gt;</span></span> <br />
&nbsp; <span class="sc3"><span class="re1">&lt;part</span> <span class="re0">name</span>=<span class="st0">&#8216;apiPath&#8217;</span> <span class="re0">type</span>=<span class="st0">&#8216;xsd:string&#8217;</span><span class="re2">/&gt;</span></span><br />
&nbsp; <span class="sc3"><span class="re1">&lt;part</span> <span class="re0">name</span>=<span class="st0">&#8216;args&#8217;</span> <span class="re0">type</span>=<span class="st0">&#8216;xsd:anyType&#8217;</span> <span class="re2">/&gt;</span></span><br />
<span class="sc3"><span class="re1">&lt;/message<span class="re2">&gt;</span></span></span> <br />
<span class="sc3"><span class="re1">&lt;message</span> <span class="re0">name</span>=<span class="st0">&#8216;callResponse&#8217;</span><span class="re2">&gt;</span></span> <br />
&nbsp; <span class="sc3"><span class="re1">&lt;part</span> <span class="re0">name</span>=<span class="st0">&#8216;callReturn&#8217;</span> <span class="re0">type</span>=<span class="st0">&#8216;xsd:anyType&#8217;</span><span class="re2">/&gt;</span></span> <br />
<span class="sc3"><span class="re1">&lt;/message<span class="re2">&gt;</span></span></span> </p>
<p><span class="sc3"><span class="re1">&lt;portType</span> <span class="re0">name</span>=<span class="st0">&#8216;Soap_ServerPortType&#8217;</span><span class="re2">&gt;</span></span> <br />
&nbsp; <span class="sc3"><span class="re1">&lt;operation</span> <span class="re0">name</span>=<span class="st0">&#8216;call&#8217;</span><span class="re2">&gt;</span></span> <br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;input</span> <span class="re0">message</span>=<span class="st0">&#8216;tns:callRequest&#8217;</span><span class="re2">/&gt;</span></span> <br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;output</span> <span class="re0">message</span>=<span class="st0">&#8216;tns:callResponse&#8217;</span><span class="re2">/&gt;</span></span> <br />
&nbsp; <span class="sc3"><span class="re1">&lt;/operation<span class="re2">&gt;</span></span></span> <br />
<span class="sc3"><span class="re1">&lt;/portType<span class="re2">&gt;</span></span></span> </p>
<p><span class="sc3"><span class="re1">&lt;binding</span> <span class="re0">name</span>=<span class="st0">&#8216;Soap_ServerBinding&#8217;</span> <span class="re0">type</span>=<span class="st0">&#8216;tns:Soap_ServerPortType&#8217;</span><span class="re2">&gt;</span></span> <br />
&nbsp; <span class="sc3"><span class="re1">&lt;soap:binding</span> <span class="re0">style</span>=<span class="st0">&#8216;rpc&#8217;</span> </span><br />
<span class="sc3"> &nbsp; &nbsp;<span class="re0">transport</span>=<span class="st0">&#8216;http://schemas.xmlsoap.org/soap/http&#8217;</span><span class="re2">/&gt;</span></span> <br />
&nbsp; <span class="sc3"><span class="re1">&lt;operation</span> <span class="re0">name</span>=<span class="st0">&#8216;call&#8217;</span><span class="re2">&gt;</span></span> <br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;soap:operation</span> <span class="re0">soapAction</span>=<span class="st0">&#8216;urn:call&#8217;</span><span class="re2">/&gt;</span></span> <br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;input<span class="re2">&gt;</span></span></span> <br />
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;soap:body</span> <span class="re0">namespace</span>=<span class="st0">&quot;urn:Soap_Server&quot;</span> <span class="re0">use</span>=<span class="st0">&quot;encoded&quot;</span> <span class="re0">encodingStyle</span>=<span class="st0">&quot;http://schemas.xmlsoap.org/soap/encoding/&quot;</span> <span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/input<span class="re2">&gt;</span></span></span> <br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;output<span class="re2">&gt;</span></span></span> <br />
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;soap:body</span> <span class="re0">namespace</span>=<span class="st0">&quot;urn:Soap_Server&quot;</span> <span class="re0">use</span>=<span class="st0">&quot;encoded&quot;</span> <span class="re0">encodingStyle</span>=<span class="st0">&quot;http://schemas.xmlsoap.org/soap/encoding/&quot;</span> <span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/output<span class="re2">&gt;</span></span></span> <br />
&nbsp; <span class="sc3"><span class="re1">&lt;/operation<span class="re2">&gt;</span></span></span> <br />
<span class="sc3"><span class="re1">&lt;/binding<span class="re2">&gt;</span></span></span> </p>
<p><span class="sc3"><span class="re1">&lt;service</span> <span class="re0">name</span>=<span class="st0">&#8216;Soap_ServerService&#8217;</span><span class="re2">&gt;</span></span> <br />
&nbsp; <span class="sc3"><span class="re1">&lt;port</span> <span class="re0">name</span>=<span class="st0">&#8216;Soap_ServerPort&#8217;</span> <span class="re0">binding</span>=<span class="st0">&#8216;tns:Soap_ServerBinding&#8217;</span><span class="re2">&gt;</span></span> <br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;soap:address</span> <span class="re0">location</span>=<span class="st0">&#8216;http://yourdomain/soap/server/server.php&#8217;</span><span class="re2">/&gt;</span></span> <br />
&nbsp; <span class="sc3"><span class="re1">&lt;/port<span class="re2">&gt;</span></span></span> <br />
<span class="sc3"><span class="re1">&lt;/service<span class="re2">&gt;</span></span></span> <br />
<span class="sc3"><span class="re1">&lt;/definitions<span class="re2">&gt;</span></span></span></div>
</div>
<p>Fangen wir also ganz unten an. In diesem Teil gibt man die Adresse des Servers an, mit dem kommuniziert wird.</p>
<div class="codesnip-container" >
<div class="xml codesnip" style="font-family:monospace;"><span class="sc3"><span class="re1">&lt;service</span> <span class="re0">name</span>=<span class="st0">&#8216;Soap_ServerService&#8217;</span><span class="re2">&gt;</span></span> <br />
&nbsp; <span class="sc3"><span class="re1">&lt;port</span> <span class="re0">name</span>=<span class="st0">&#8216;Soap_ServerPort&#8217;</span> <span class="re0">binding</span>=<span class="st0">&#8216;tns:Soap_ServerBinding&#8217;</span><span class="re2">&gt;</span></span> <br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;soap:address</span> <span class="re0">location</span>=<span class="st0">&#8216;http://yourdomain/soap/server/server.php&#8217;</span><span class="re2">/&gt;</span></span> <br />
&nbsp; <span class="sc3"><span class="re1">&lt;/port<span class="re2">&gt;</span></span></span> <br />
<span class="sc3"><span class="re1">&lt;/service<span class="re2">&gt;</span></span></span></div>
</div>
<p>Der &#8220;Soap_Server&#8221; Teil der verschiedenen name-Attribute ist übrigens frei wählbar, sollte aber in der gesamten WSDL Datei einheitlich sein.<br />
Das binding-Attribut verweist auf den darüberliegenden Teil mit den Bindings.<br />
Der Teil schaut umfangreicher aus als er tatsächlich ist. Hier wird beschrieben wie der Client und der Server miteinander kommunizieren. Für jede zur Verfügung gestellte Methode ist ein eigener operation-Block notwendig. Ändern muss man nur den Namen der auszuführenden Methode. In diesem Fall gibt es nur eine Operation mit dem Namen &#8220;call&#8221;.</p>
<div class="codesnip-container" >
<div class="xml codesnip" style="font-family:monospace;"><span class="sc3"><span class="re1">&lt;binding</span> <span class="re0">name</span>=<span class="st0">&#8216;Soap_ServerBinding&#8217;</span> <span class="re0">type</span>=<span class="st0">&#8216;tns:Soap_ServerPortType&#8217;</span><span class="re2">&gt;</span></span> <br />
&nbsp; <span class="sc3"><span class="re1">&lt;soap:binding</span> <span class="re0">style</span>=<span class="st0">&#8216;rpc&#8217;</span> </span><br />
<span class="sc3"> &nbsp; &nbsp;<span class="re0">transport</span>=<span class="st0">&#8216;http://schemas.xmlsoap.org/soap/http&#8217;</span><span class="re2">/&gt;</span></span> <br />
&nbsp; <span class="sc3"><span class="re1">&lt;operation</span> <span class="re0">name</span>=<span class="st0">&#8216;call&#8217;</span><span class="re2">&gt;</span></span> <br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;soap:operation</span> <span class="re0">soapAction</span>=<span class="st0">&#8216;urn:call&#8217;</span><span class="re2">/&gt;</span></span> <br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;input<span class="re2">&gt;</span></span></span> <br />
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;soap:body</span> <span class="re0">namespace</span>=<span class="st0">&quot;urn:Soap_Server&quot;</span> <span class="re0">use</span>=<span class="st0">&quot;encoded&quot;</span> <span class="re0">encodingStyle</span>=<span class="st0">&quot;http://schemas.xmlsoap.org/soap/encoding/&quot;</span> <span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/input<span class="re2">&gt;</span></span></span> <br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;output<span class="re2">&gt;</span></span></span> <br />
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;soap:body</span> <span class="re0">namespace</span>=<span class="st0">&quot;urn:Soap_Server&quot;</span> <span class="re0">use</span>=<span class="st0">&quot;encoded&quot;</span> <span class="re0">encodingStyle</span>=<span class="st0">&quot;http://schemas.xmlsoap.org/soap/encoding/&quot;</span> <span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/output<span class="re2">&gt;</span></span></span> <br />
&nbsp; <span class="sc3"><span class="re1">&lt;/operation<span class="re2">&gt;</span></span></span> <br />
<span class="sc3"><span class="re1">&lt;/binding<span class="re2">&gt;</span></span></span></div>
</div>
<p>Der nächste Teil verbindet den Bindings-Block mit den Message-Blöcken. Also immer darauf achten die gleichen Namen zu verwenden, sodass die einzelnen Teile miteinander in Beziehung stehen. Wieder gilt: pro Methode ein operation-Block.</p>
<div class="codesnip-container" >
<div class="xml codesnip" style="font-family:monospace;"><span class="sc3"><span class="re1">&lt;portType</span> <span class="re0">name</span>=<span class="st0">&#8216;Soap_ServerPortType&#8217;</span><span class="re2">&gt;</span></span> <br />
&nbsp; <span class="sc3"><span class="re1">&lt;operation</span> <span class="re0">name</span>=<span class="st0">&#8216;call&#8217;</span><span class="re2">&gt;</span></span> <br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;input</span> <span class="re0">message</span>=<span class="st0">&#8216;tns:callRequest&#8217;</span><span class="re2">/&gt;</span></span> <br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;output</span> <span class="re0">message</span>=<span class="st0">&#8216;tns:callResponse&#8217;</span><span class="re2">/&gt;</span></span> <br />
&nbsp; <span class="sc3"><span class="re1">&lt;/operation<span class="re2">&gt;</span></span></span> <br />
<span class="sc3"><span class="re1">&lt;/portType<span class="re2">&gt;</span></span></span></div>
</div>
<p>In den Message-Blöcken werden die Parameter der angegebenen Methoden beschrieben. Für jedes message-Attribut der einzelnen Operationen, die wir im portType-Block definiert haben, wird ein Message-Block benötigt. In diesem Fall also zwei (einer für die zu übergebenden Parameter und einer für den Rückgabewert).<br />
Für jeden zu übergebenden Parameter ist ein part-Element notwendig, in dem man den Namen des Parameters und den Datentyp beschreibt.</p>
<div class="codesnip-container" >
<div class="xml codesnip" style="font-family:monospace;"><span class="sc3"><span class="re1">&lt;message</span> <span class="re0">name</span>=<span class="st0">&#8216;callRequest&#8217;</span><span class="re2">&gt;</span></span> <br />
&nbsp; <span class="sc3"><span class="re1">&lt;part</span> <span class="re0">name</span>=<span class="st0">&#8216;apiPath&#8217;</span> <span class="re0">type</span>=<span class="st0">&#8216;xsd:string&#8217;</span><span class="re2">/&gt;</span></span><br />
&nbsp; <span class="sc3"><span class="re1">&lt;part</span> <span class="re0">name</span>=<span class="st0">&#8216;args&#8217;</span> <span class="re0">type</span>=<span class="st0">&#8216;xsd:anyType&#8217;</span> <span class="re2">/&gt;</span></span><br />
<span class="sc3"><span class="re1">&lt;/message<span class="re2">&gt;</span></span></span> <br />
<span class="sc3"><span class="re1">&lt;message</span> <span class="re0">name</span>=<span class="st0">&#8216;callResponse&#8217;</span><span class="re2">&gt;</span></span> <br />
&nbsp; <span class="sc3"><span class="re1">&lt;part</span> <span class="re0">name</span>=<span class="st0">&#8216;callReturn&#8217;</span> <span class="re0">type</span>=<span class="st0">&#8216;xsd:anyType&#8217;</span><span class="re2">/&gt;</span></span> <br />
<span class="sc3"><span class="re1">&lt;/message<span class="re2">&gt;</span></span></span></div>
</div>
<p>Der Typ <em>anyType</em> ist ein eigens definierter Datentyp. Dies wird im (optinalen) types-Block gemacht. Wenn nur primitive Datentypen verwendet werden kann man ihn auch weglassen. Da in diesem Beispiel Arrays übertragen werden ist aber die Deklaration eines komplexen Datentypen erforderlich.</p>
<div class="codesnip-container" >
<div class="xml codesnip" style="font-family:monospace;"><span class="sc3"><span class="re1">&lt;types<span class="re2">&gt;</span></span></span><br />
&nbsp; <span class="sc3"><span class="re1">&lt;schema</span> <span class="re0">targetNamespace</span>=<span class="st0">&quot;urn:Soap_Server&quot;</span> <span class="re0">xmlns</span>=<span class="st0">&quot;http://www.w3.org/2001/XMLSchema&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;import</span> <span class="re0">namespace</span>=<span class="st0">&quot;http://schemas.xmlsoap.org/soap/encoding/&quot;</span> <span class="re0">schemaLocation</span>=<span class="st0">&quot;http://schemas.xmlsoap.org/soap/encoding/&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;complexType</span> <span class="re0">name</span>=<span class="st0">&quot;FixedArray&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;complexContent<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;restriction</span> <span class="re0">base</span>=<span class="st0">&quot;soapenc:Array&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;attribute</span> <span class="re0">ref</span>=<span class="st0">&quot;soapenc:arrayType&quot;</span> <span class="re0">wsdl:arrayType</span>=<span class="st0">&quot;xsd:anyType[]&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;/restriction<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/complexContent<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;/complexType<span class="re2">&gt;</span></span></span><br />
&nbsp; <span class="sc3"><span class="re1">&lt;/schema<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/types<span class="re2">&gt;</span></span></span></div>
</div>
<p>Im definitions-Element werden noch die Namensräume deklariert. Bis auf einige Änderungen, die denke ich selbsterklärend sind, kann man diesen Teil in jeder WSDL Datei so lassen wie er ist.</p>
<div class="codesnip-container" >
<div class="xml codesnip" style="font-family:monospace;"><span class="sc3"><span class="re1">&lt;definitions</span></span><br />
<span class="sc3"> &nbsp;<span class="re0">targetNamespace</span>=<span class="st0">&#8216;urn:Soap_Server&#8217;</span></span><br />
<span class="sc3"> &nbsp;<span class="re0">xmlns:tns</span>=<span class="st0">&#8216;urn:Soap_Server&#8217;</span> </span><br />
<span class="sc3"> &nbsp;<span class="re0">xmlns:soap</span>=<span class="st0">&#8216;http://schemas.xmlsoap.org/wsdl/soap/&#8217;</span> </span><br />
<span class="sc3"> &nbsp;<span class="re0">xmlns:xsd</span>=<span class="st0">&#8216;http://www.w3.org/2001/XMLSchema&#8217;</span> </span><br />
<span class="sc3"> &nbsp;<span class="re0">xmlns:soapenc</span>=<span class="st0">&#8216;http://schemas.xmlsoap.org/soap/encoding/&#8217;</span> </span><br />
<span class="sc3"> &nbsp;<span class="re0">xmlns:wsdl</span>=<span class="st0">&#8216;http://schemas.xmlsoap.org/wsdl/&#8217;</span> </span><br />
<span class="sc3"> &nbsp;<span class="re0">xmlns</span>=<span class="st0">&#8216;http://schemas.xmlsoap.org/wsdl/&#8217;</span><span class="re2">&gt;</span></span></div>
</div>
<h3>Der Server</h3>
<p>Nun komme ich zum PHP Teil. Der Server wird mit der in PHP5 integrierten Soap Unterstützung aufgebaut. Der Soap-Server macht nichts anderes als eintreffende Anfragen zu behandeln und eine Antwort zurückzugeben. Die WSDL Datei stellt hier die Schnittstelle zwischen Server und Client dar.<br />
Der folgende Code erstellt einen neuen Soap-Server.</p>
<div class="codesnip-container" >
<div class="php codesnip" style="font-family:monospace;"><span class="kw2">&lt;?php</span></p>
<p><a href="http://www.php.net/ini_set"><span class="kw3">ini_set</span></a><span class="br0">&#40;</span><span class="st0">&quot;soap.wsdl_cache_enabled&quot;</span><span class="sy0">,</span> <span class="st0">&quot;0&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Schaltet den WSDL Cache aus.</span></p>
<p><span class="co1">// Ein neuer Soap Server dem die WSDL Datei übergeben wird. Diese liegt im selben Verzeichnis wie diese Datei.</span><br />
<span class="re0">$server</span> <span class="sy0">=</span> <span class="kw2">new</span> SoapServer<span class="br0">&#40;</span><span class="st_h">&#8216;mywsdl.wsdl&#8217;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="co1">// Setzt die zu verwendende Klasse. Wenn sich diese in einer seperaten Datei befindet muss sie vorher mittels include inkludiert werden.</span><br />
<span class="re0">$server</span><span class="sy0">-&gt;</span><span class="me1">setClass</span><span class="br0">&#40;</span><span class="st_h">&#8216;Soap_Server&#8217;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="re0">$server</span><span class="sy0">-&gt;</span><span class="me1">handle</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// startet den Soap Server</span></div>
</div>
<p>In der hier eingebundenen Klasse könnten jetzt verschiedenste Methoden stehen, die alle in der WSDL Datei beschrieben werden können und so dem Client verfügbar gemacht werden.<br />
Ich mache es aber so, dass ich nur eine Methode bereitstelle, die mir je nach übergebenen Parametern eine Klasse instanziert und eine bestimmte Funktion aufruft.<br />
Der Vorteil dieser Variante liegt eigentlich auf der Hand. Ich muss bei einer Erweiterung meines Webservices keine Änderungen an der WSDL Datei durchführen. Im Grunde muss ich nur bekannt geben mit welchem Aufruf meine neu eingebundenen Klassen und Methoden erreichbar sind.</p>
<p>Hier also der zweite Teil der Datei server.php</p>
<div class="codesnip-container" >
<div class="php codesnip" style="font-family:monospace;"><span class="kw2">class</span> Soap_Server<br />
<span class="br0">&#123;</span> &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> call<span class="br0">&#40;</span><span class="re0">$apiPath</span><span class="sy0">,</span> <span class="re0">$args</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Der API Pfad besteht aus dem Namen der aufzurufenden Klasse und der Methode, getrennt durch einen Punkt. Die Werte werden in den beiden Variablen gespeichert.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/list"><span class="kw3">list</span></a><span class="br0">&#40;</span><span class="re0">$resourceName</span><span class="sy0">,</span> <span class="re0">$methodName</span><span class="br0">&#41;</span> <span class="sy0">=</span> <a href="http://www.php.net/explode"><span class="kw3">explode</span></a><span class="br0">&#40;</span><span class="st_h">&#8216;.&#8217;</span><span class="sy0">,</span> <span class="re0">$apiPath</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// War der übergebene API Pfad falsch wird ein Soap Fehler ausgelöst. Dieser kann vom Client abgefangen und ausgewertet werden.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$resourceName</span><span class="br0">&#41;</span> <span class="sy0">||</span> <a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$methodName</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw <span class="kw2">new</span> SoapFault<span class="br0">&#40;</span><span class="st_h">&#8216;Client&#8217;</span><span class="sy0">,</span> <span class="st_h">&#8216;API Path incorrect&#8217;</span><span class="sy0">,</span> <span class="st_h">&#8217;server.php&#8217;</span><span class="sy0">,</span> <span class="st_h">&#8221;</span><span class="br0">&#41;</span><span class="sy0">;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Exisitiert die Datei nicht, wird ebenfalls ein Soap Fehler ausgelöst</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/file_exists"><span class="kw3">file_exists</span></a><span class="br0">&#40;</span><span class="st0">&quot;api/&quot;</span><span class="sy0">.</span><span class="re0">$resourceName</span><span class="sy0">.</span><span class="st0">&quot;.php&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw <span class="kw2">new</span> SoapFault<span class="br0">&#40;</span><span class="st_h">&#8216;Client&#8217;</span><span class="sy0">,</span> <span class="st_h">&#8216;API Path incorrect&#8217;</span><span class="sy0">,</span> <span class="st_h">&#8217;server.php&#8217;</span><span class="sy0">,</span> <span class="st_h">&#8221;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Datei wird eingebunden&#8230;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st0">&quot;api/&quot;</span><span class="sy0">.</span><span class="re0">$resourceName</span><span class="sy0">.</span><span class="st0">&quot;.php&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// &#8230; und instanziert.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$classInstance</span> <span class="sy0">=</span> <span class="kw2">new</span> <span class="re0">$resourceName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Und noch eine Fehlerüberprüfung ob die Methode auch aufrufbar ist.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/is_callable"><span class="kw3">is_callable</span></a><span class="br0">&#40;</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="re0">$classInstance</span><span class="sy0">,</span> <span class="re0">$methodName</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Wenn ja, dann wird sie aufgerufen und das Ergebnis zurückgeschickt</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$classInstance</span><span class="sy0">-&gt;</span><span class="re0">$methodName</span><span class="br0">&#40;</span><span class="br0">&#40;</span><a href="http://www.php.net/is_array"><span class="kw3">is_array</span></a><span class="br0">&#40;</span><span class="re0">$args</span><span class="br0">&#41;</span> ? <span class="re0">$args</span> <span class="sy0">:</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="re0">$args</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Wenn nicht&#8230; dann lösen wir wieder einen Soap Fehler aus.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw <span class="kw2">new</span> SoapFault<span class="br0">&#40;</span><span class="st_h">&#8216;Client&#8217;</span><span class="sy0">,</span> <span class="st_h">&#8216;API Path incorrect&#8217;</span><span class="sy0">,</span> <span class="st_h">&#8217;server.php&#8217;</span><span class="sy0">,</span> <span class="st_h">&#8221;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="sy1">?&gt;</span></div>
</div>
<p>So oder ähnlich könnte man die eigentlich gewünschte Methode aufrufen. In der Praxis bietet sich an das Ganze über eine XML-Konfigurationsdatei zu mappen, sodass der API Pfad nicht unbedingt dem Speicherort oder Namen der Klasse entsprechen muss.</p>
<p>Die ganze Arbeit erledigt hier die <em>call</em>-Methode. Im Grunde kann ich so die verschiedensten Klassen bereitstellen. Ein Beispielklasse könnte so aussehen. Die bereitgestellten Methoden sollen hierbei nur das Prinzip verdeutlichen.</p>
<div class="codesnip-container" >
<div class="php codesnip" style="font-family:monospace;"><span class="kw2">&lt;?php</span></p>
<p><span class="kw2">class</span> Books<br />
<span class="br0">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Diese Daten würden normalerweise aus einer Datenbank kommen.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> <span class="re0">$booklist</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;title&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&#8216;Lord of the Rings&#8217;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;genre&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&#8216;Fantasy&#8217;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;author&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&#8216;J.R.R. Tolkien&#8217;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;title&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&#8216;1984&#8242;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;genre&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&#8216;Science Fiction&#8217;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;author&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&#8216;George Orwell&#8217;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;title&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&#8216;Brave new World&#8217;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;genre&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&#8216;Science Fiction&#8217;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;author&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&#8216;Aldous Huxley&#8217;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Liefert Bücher zurück die den Suchkriterien entsprechen.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> items<span class="br0">&#40;</span><span class="re0">$filters</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/is_array"><span class="kw3">is_array</span></a><span class="br0">&#40;</span><span class="re0">$filters</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$list</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">booklist</span> <span class="kw1">as</span> <span class="re0">$key</span> <span class="sy0">=&gt;</span> <span class="re0">$book</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$inc</span> <span class="sy0">=</span> <span class="kw4">true</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$filters</span> <span class="kw1">as</span> <span class="re0">$filtername</span> <span class="sy0">=&gt;</span> <span class="re0">$value</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$book</span><span class="br0">&#91;</span><span class="re0">$filtername</span><span class="br0">&#93;</span> <span class="sy0">!==</span> <span class="re0">$value</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$inc</span> <span class="sy0">=</span> <span class="kw4">false</span><span class="sy0">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$inc</span><span class="br0">&#41;</span> <span class="re0">$list</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$book</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$list</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">booklist</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Liefert genau ein Buch, dass dem übergebenen Titel entspricht.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> info<span class="br0">&#40;</span><span class="re0">$args</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/is_array"><span class="kw3">is_array</span></a><span class="br0">&#40;</span><span class="re0">$args</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$args</span><span class="br0">&#91;</span><span class="st_h">&#8216;title&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">booklist</span> <span class="kw1">as</span> <span class="re0">$book</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$book</span><span class="br0">&#91;</span><span class="st_h">&#8216;title&#8217;</span><span class="br0">&#93;</span> <span class="sy0">===</span> <span class="re0">$args</span><span class="br0">&#91;</span><span class="st_h">&#8216;title&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$book</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw4">null</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<span class="sy1">?&gt;</span></div>
</div>
<h3>Der Client</h3>
<p>Der Client ist eigentlich recht einfach umgesetzt. Es bedarf eigentlich nur einer Zeile um einen SoapClient zu starten. Diesem wird der URL der WSDL Datei übergeben.</p>
<div class="codesnip-container" >
<div class="php codesnip" style="font-family:monospace;"><span class="kw2">&lt;?php</span></p>
<p><a href="http://www.php.net/ini_set"><span class="kw3">ini_set</span></a><span class="br0">&#40;</span><span class="st0">&quot;soap.wsdl_cache_enabled&quot;</span><span class="sy0">,</span> <span class="st0">&quot;0&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// Schaltet den WSDL Cache aus.</span></p>
<p><span class="co1">// Ein neuer Soap Client dem die WSDL Datei übergeben wird.</span><br />
<span class="re0">$proxy</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">=</span> <span class="kw2">new</span> SoapClient<span class="br0">&#40;</span><span class="st_h">&#8216;http://localhost/soap/server/mywsdl.wsdl&#8217;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="co1">// Und so schauen die Aufrufe aus. Die Ausgaben von var_dump habe ich in Kommentaren darunter geschrieben.</span><br />
<a href="http://www.php.net/var_dump"><span class="kw3">var_dump</span></a><span class="br0">&#40;</span><span class="re0">$proxy</span><span class="sy0">-&gt;</span><span class="me1">call</span><span class="br0">&#40;</span><span class="st0">&quot;Books.items&quot;</span><span class="sy0">,</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">&#8216;genre&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&#8216;Science Fiction&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw1">echo</span> <span class="st0">&quot;&lt;br /&gt;&lt;br /&gt;&quot;</span><span class="sy0">;</span><br />
<span class="co1">// array(2) { [0]=&gt; array(3) { [&quot;title&quot;]=&gt; string(4) &quot;1984&quot; [&quot;genre&quot;]=&gt; string(15) &quot;Science Fiction&quot; [&quot;author&quot;]=&gt; string(13) &quot;George Orwell&quot; } [1]=&gt; array(3) { [&quot;title&quot;]=&gt; string(15) &quot;Brave new World&quot; [&quot;genre&quot;]=&gt; string(15) &quot;Science Fiction&quot; [&quot;author&quot;]=&gt; string(13) &quot;Aldous Huxley&quot; } } </span></p>
<p><a href="http://www.php.net/var_dump"><span class="kw3">var_dump</span></a><span class="br0">&#40;</span><span class="re0">$proxy</span><span class="sy0">-&gt;</span><span class="me1">call</span><span class="br0">&#40;</span><span class="st0">&quot;Books.items&quot;</span><span class="sy0">,</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">&#8216;genre&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&#8216;Fantasy&#8217;</span><span class="sy0">,</span> <span class="st_h">&#8216;author&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&#8216;J.R.R. Tolkien&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw1">echo</span> <span class="st0">&quot;&lt;br /&gt;&lt;br /&gt;&quot;</span><span class="sy0">;</span><br />
<span class="co1">// array(1) { [0]=&gt; array(3) { [&quot;title&quot;]=&gt; string(17) &quot;Lord of the Rings&quot; [&quot;genre&quot;]=&gt; string(7) &quot;Fantasy&quot; [&quot;author&quot;]=&gt; string(14) &quot;J.R.R. Tolkien&quot; } } </span></p>
<p><a href="http://www.php.net/var_dump"><span class="kw3">var_dump</span></a><span class="br0">&#40;</span><span class="re0">$proxy</span><span class="sy0">-&gt;</span><span class="me1">call</span><span class="br0">&#40;</span><span class="st0">&quot;Books.items&quot;</span><span class="sy0">,</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">&#8216;author&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&#8216;George Orwell&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw1">echo</span> <span class="st0">&quot;&lt;br /&gt;&lt;br /&gt;&quot;</span><span class="sy0">;</span><br />
<span class="co1">// array(1) { [0]=&gt; array(3) { [&quot;title&quot;]=&gt; string(4) &quot;1984&quot; [&quot;genre&quot;]=&gt; string(15) &quot;Science Fiction&quot; [&quot;author&quot;]=&gt; string(13) &quot;George Orwell&quot; } }</span></p>
<p><a href="http://www.php.net/var_dump"><span class="kw3">var_dump</span></a><span class="br0">&#40;</span><span class="re0">$proxy</span><span class="sy0">-&gt;</span><span class="me1">call</span><span class="br0">&#40;</span><span class="st0">&quot;Books.info&quot;</span><span class="sy0">,</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">&#8216;title&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&#8216;Brave new World&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="co1">//array(3) { [&quot;title&quot;]=&gt; string(15) &quot;Brave new World&quot; [&quot;genre&quot;]=&gt; string(15) &quot;Science Fiction&quot; [&quot;author&quot;]=&gt; string(13) &quot;Aldous Huxley&quot; }</span></p>
<p><span class="sy1">?&gt;</span></div>
</div>
<p>Abschließend möchte ich noch kurz auf die Fehlerbehandlung eingehen, auf die ich im voranstehenden Client Beispiel verzichtet habe. Da der Server ja Fehler auslöst, falls zum Beispiel ein falscher API Pfad übergeben wird, gilt es diese auch abzufangen. Am Besten macht man das mit einem try/catch Block.<br />
Im fogenden Code Beispiel wurde der erste Aufruf verändert. Hier wird durch einen Schreibfehler die Klasse <em>Book</em> anstatt <em>Books</em> aufgerufen. Da es diese nicht gibt, wird ein Fehler ausgelöst, den wir aber abfangen.</p>
<div class="codesnip-container" >
<div class="php codesnip" style="font-family:monospace;">try <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$return</span> <span class="sy0">=</span> <span class="re0">$proxy</span><span class="sy0">-&gt;</span><span class="me1">call</span><span class="br0">&#40;</span><span class="st0">&quot;Book.items&quot;</span><span class="sy0">,</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">&#8216;genre&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&#8216;Science Fiction&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/var_dump"><span class="kw3">var_dump</span></a><span class="br0">&#40;</span><span class="re0">$return</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span> catch<span class="br0">&#40;</span>SoapFault <span class="re0">$ex</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">echo</span> <span class="st0">&quot;Fehler: &quot;</span><span class="sy0">.</span><span class="re0">$ex</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.lamprecht-web.at/2010/05/webservices-mit-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

