<?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>Onlinemagazin: devmag.net &#187; Webservices</title>
	<atom:link href="http://www.devmag.net/category/webservices/feed" rel="self" type="application/rss+xml" />
	<link>http://www.devmag.net</link>
	<description>Regelmäßig neue Artikel rund um das Homepage Bauen mit HTML, CSS, AJAX, PHP und XML.</description>
	<lastBuildDate>Sun, 30 Oct 2011 18:38:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Twitter API &#8211; Nachrichten senden</title>
		<link>http://www.devmag.net/php/1138-twitter-api-nachrichten-senden.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=twitter-api-nachrichten-senden</link>
		<comments>http://www.devmag.net/php/1138-twitter-api-nachrichten-senden.html#comments</comments>
		<pubDate>Tue, 25 Aug 2009 08:18:33 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[APIs]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webservices]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=1138</guid>
		<description><![CDATA[Twittern ist doch sehr trendig. Seit 2007 gibt es die Twitter API &#8211; hier soll ein kleines Script vorgestellt werden, mit welchem ihr munter von eurer Webseite loszwitschern könnt. Das alles läuft mit ein paar Zeilen PHP Code und einem Zugang zur Twitter API. Die API von Twitter wurde 2007 veröffentlicht. Mittlerweile gibt es natürlich [...]


Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/42-diese-seite-weiterempfehlen.html' rel='bookmark' title='Permanent Link: Diese Seite weiterempfehlen&#8230;'>Diese Seite weiterempfehlen&#8230;</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="float: right;margin: 4px;"><div class="adslot-468" >
<script type="text/javascript"><!--
google_ad_client = "pub-7748812030658677";
/* 468x60, Erstellt 20.08.09 */
google_ad_slot = "9850520828";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></p> <p><a href="http://www.devmag.net/wp-content/uploads/illu_php_twitter.jpg"><img class="illu alignright" title="Twitter Status mit PHP und der Twitter API updaten" src="http://www.devmag.net/wp-content/uploads/illu_php_twitter.jpg" alt="Twitter Status mit PHP und der Twitter API updaten" width="50" height="50" /></a>Twittern ist doch sehr trendig. Seit 2007 gibt es die Twitter API &#8211; hier soll ein kleines Script vorgestellt werden, mit welchem ihr munter von eurer Webseite loszwitschern könnt. Das alles läuft mit ein paar Zeilen PHP Code und einem Zugang zur Twitter API.<span id="more-1138"></span></p>
<p>Die API von Twitter wurde 2007 veröffentlicht. Mittlerweile gibt es natürlich auch eine PHP Programmbibliothek, mit der Sie Twitter z.B. in Ihr Blog integrieren können. Auf Dr.Web.de wurde ein kleines <a title="Dr.Web Twitter Plugin" href="http://www.drweb.de/magazin/twittern-mit-wordpress-und-dr-web/" target="_blank">WordPress Plugin </a>vorgestellt, mit dem man automatisch Nachrichten an Twitter senden kann. Das ganze Skript können Sie <a title="Twitter PHP Script" href="http://www.box.net/shared/trnomoyh15" target="_blank">hier</a> herunterladen.</p>
<p>Es besteht aus einer Datei. Einem Script, um die Nachrichten an Twitter zu senden und einem Formular, über welches die Nachrichten eingegeben werden.</p>
<p>Der PHP Code für das Senden der Message ist wie folgt:</p>
<p>insertTwitterMsg.php<br />
<code>&lt;?php<br />
$twitter_username ='yourTwitterUserName';<br />
$twitter_psw ='yourTwitterPassword';<br />
require('twitterAPI.php');<br />
if(isset($_POST['twitter_msg']))<br />
{<br />
$twitter_message=$_POST['twitter_msg'];<br />
if(strlen($twitter_message)&lt;1){<br />
$error=1;<br />
} else {<br />
$twitter_status=postToTwitter($twitter_username, $twitter_psw, $twitter_message);<br />
}<br />
}<br />
?&gt;</code></p>
<p>Hier müssen Sie lediglich ihren Twitter-Benutzername sowie ihr Twitter Passwort anpassen. In der ersten Zeile wird die Twitter API eingefügt. Diese ist ebenfalls in der ZIP Datei enthalten. Daraufhin folgt eine Überprüfung ob die Message auch mindestens ein Zeichen enthält. Wenn nicht, spuckt das Skript eine Fehlermeldung us.</p>
<p>Ansonsten wird die Nachricht an Twitter über die Funktion <code>postToTwitter() </code>gesendet; diese steckt in der Twitter API. Das Formular, über welches die Messages eingegeben werden ist ebenfalls in der insertTwitterMsg.php implementiert.</p>
<p><code>&lt;!-- Send message to Twitter --&gt;<br />
&lt;?php<br />
if(isset($_POST['twitter_msg']) &amp;&amp; !isset($error)){?&gt;<br />
&lt;div&gt;&lt;?php echo $twitter_status ?&gt;&lt;/div&gt;<br />
&lt;?php } else if(isset($error)){?&gt;<br />
&lt;div&gt;Error: please insert a message!&lt;/div&gt;<br />
&lt;?php }?&gt;<br />
&lt;p&gt;&lt;strong&gt;What are you doing?&lt;/strong&gt;&lt;/p&gt;<br />
&lt;form action="insertTwitterMsg.php" method="post"&gt;<br />
&lt;input name="twitter_msg" type="text" id="twitter_msg" size="40" maxlength="140"/&gt;<br />
&lt;input type="submit" name="button" id="button" value="post" /&gt;<br />
&lt;/form&gt;</code></p>
<p>Sofern in der Umgebungsvariable <code>$_POST['']</code> die Message noch nicht definiert ist, oder ein Fehler entstanden ist &#8211; etwa weil die Nachricht weniger als ein Zeichen hatte, so wird die Fehlermeldung ausgegeben. Ansonsten wird der Twitter Status ausgegeben, welcher besagt, ob die Message erfolgreich übertragen wurde. Daruner wird das Formular ausgegeben. So einfach gehts!</p>


<p>Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/42-diese-seite-weiterempfehlen.html' rel='bookmark' title='Permanent Link: Diese Seite weiterempfehlen&#8230;'>Diese Seite weiterempfehlen&#8230;</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/php/1138-twitter-api-nachrichten-senden.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Workshop: Einführung in Webservices</title>
		<link>http://www.devmag.net/php/63-workshop-einfhrung-in-webservices.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=workshop-einfhrung-in-webservices</link>
		<comments>http://www.devmag.net/php/63-workshop-einfhrung-in-webservices.html#comments</comments>
		<pubDate>Thu, 12 Mar 2009 10:00:00 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webservices]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=63</guid>
		<description><![CDATA[No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.devmag.net/wp-content/uploads/illu_webservice.jpg" class="illu" width="60" height="60" align="left" alt="Workshop: Einf&uuml;hrung in Webservices " />
Der Begriff Webservices wird das Internet f&uuml;r die n&auml;chsten
  Jahre tiefgreifend pr&auml;gen &#8211; doch was sind Webservices &uuml;berhaupt,
  wie funktionieren sie und wie kann sie ein Webworker nutzen? Auf diese Fragen
  gibt dieser Workshop antwort.<span id="more-63"></span>          <p>Schon der Begriff &quot;Webservices&quot; enth&auml;lt eine eigentliche Definition.
  Webservices sind Dienste, die &uuml;ber das Internet bereitgestellt werden.
  Trotz dieser scheinbar recht einfachen Definition, haben sich die &quot;Gro&szlig;en&quot;,
  Microsoft, IBM, Hewlett Packard, Sun etc. noch nicht auf eine einheitliche Definition
  geeinigt. Unter <a href="http://www.jeckle.de/webServices/">http://www.jeckle.de/webServices/</a>
  finden Sie eine Auflistung der verschiedensten Definitionen von, was Webservices
  eigentlich sind. <br>
  Als kleinster gemeinsamer Nenner kann man sagen, dass &uuml;ber Webservices
  dem Client (das ist der Nutzer) Funktionen, Daten und Anwendungen bereitgestellt
  werden k&ouml;nnen.<br>
  Dabei ist der Client nicht mehr der vor seinem Computer sitzende Surfer &#8211;
  es sind eigenst&auml;ndige Anwendungen, welche Webservices f&uuml;r die eigene
  Programmfunktion nutzen.<br>
  Ein einfaches Beispiel daf&uuml;r sind die Google Webservices. Dabei kann ein
  Programmierer &uuml;ber Webservices auf die m&auml;chtige Google Suchfunktionen
  zur&uuml;ckgreifen, und diese in die eigene Anwendung integrieren. So k&ouml;nnen
  z.B. siteinterne Suchmaschinen ohne viel Aufwand erstellt werden; dies soll
  im dritten Teil dieses Workshops beleuchtet werden. <br>
  &Uuml;ber Webservices kann man folglich ganze Anwendungen modellieren. Doch
  wie funktioniert die Kommunikation zwischen den verschiedenen Anwendungen? Die
  Daten m&uuml;ssen ja in irgendeiner Form von einem Programm zum anderen geschickt
  werden.<br>
  Das versenden der Daten wird &uuml;ber das http Protokoll bewerkstelligt. Die
  Anfragen und Antworten werden in Form von XML gesendet. Man hat sich auf diese
  beiden Standards geeinigt, da sie quasi &uuml;berall &quot;verstanden&quot;
  werden. Sie sind plattform- und insbesondere programmiertechnisch unabh&auml;ngig.
  <br>
  Die Anfragen an den Webservice werden folglich in XML verpackt und &uuml;ber
  http versendet. Die XML Nachricht wird vom Webservice interpretiert und wiederum
  in Form von XML beantwortet. <br>
  Da Webservices f&uuml;r die Integration von Programmfunktionen in anderen Anwendungen
  gedacht sind, musste man sich auch hier auf eine einheitliche Form der Daten&uuml;bertragung
  zum Nutzen aller einigen. So entstand SOAP, das Simple Object Access Protocol,
  basierend auf XML. Dadurch wurde erreicht, dass alle Webservice Anfragen und
  Antworten eine einheitliche Form haben. Zwar gibt es auch Webservices, die nicht
  auf SOAP zur&uuml;ckgreifen, jedoch wird sich SOAP in Zukunft durchsetzen, da
  nur durch eine einheitliche Daten&uuml;bertragung die Nutzung von Webservices
  eine allgemeine Bedeutung erlangen kann.<br>
  Ein Anfrage besteht, wie man im folgenden Diagramm sehen kann aus einem festen
  Grundger&uuml;st.<br>
  <br>
  <img src="http://www.devmag.net/wp-content/uploads/webservices_soap_message.png" width="241" height="277" alt="Struktur einer SOAP Nachricht"><br>
  <strong>Struktur einer SOAP Nachricht</strong></p>
<p>Das Grundger&uuml;st &auml;hnelt sehr dem einer HTML Seite, bestehend aus einem
  Head- und einem Body-Bereich, in welchem die Antwort- bzw. Anfragedaten abgelegt
  sind.</p>
<p>In der folgenden Abbildung ist ein einfaches Schema f&uuml;r den Datenfluss
  bei der Nutzung von Webservices abgebildet. Dabei besitzt die Anwendung welche
  auf den Webservice zur&uuml;ckgreift ebenfalls einen XML Interpreter, &uuml;ber
  welchen die XML Daten in ein Format &uuml;berf&uuml;hrt werden, in welchem sie
  weiterverarbeitet werden k&ouml;nnen. Die SOAP Antwort muss folglich von der
  Anwendung verarbeitet werden. Auf diese Weise wird die Nutzung von Webservices
  nicht nur auf einzelne Programmiersprachen beschr&auml;nkt. Man kann Webservices
  &uuml;ber jede Programmiersprache verwenden, die eine XML bzw. SOAP Schnittstelle
  besitzt.<br>
  <br>
  <img src="http://www.devmag.net/wp-content/uploads/webservices_datenfluss.png" width="463" height="287" alt="Einfaches Datenflussdiagramm f&uuml;r die Nutzung von Webservices"><br>
  <strong>Einfaches Datenflussdiagramm f&uuml;r die Nutzung von Webservices</strong></p>
<p>Man kann dieses einfache Modell noch erweitern, indem man sich den Webservice
  auf welchen man zur&uuml;ckgreift selbst als eine Anwendung betrachtet welche
  auf verschiedene andere Webservices zur&uuml;ckgreift. </p>
<p>Man kann sich das an einem einfachen Beispiel veranschaulichen. Bei einer Buchbestellung
  m&ouml;chten Sie den Status ihrer Bestellung verfolgen. So k&ouml;nnen sie bei
  dem Verk&auml;ufer den Status bis zum versenden betrachten. Bei dem Zusteller
  (z.B. der Post) k&ouml;nnen sie den weiteren Verlauf verfolgen.<br>
  Durch Webservices ist es nun m&ouml;glich, dass der Verk&auml;ufer den Status
  der Bestellung auch &uuml;ber die eigenen Systemgrenzen verfolgen kann, indem
  er auf einen Webservice des Zustellers zur&uuml;ckgreift und dort den Status
  des Versandes ermitteln kann und diesen an den K&auml;ufer weitergeben kann.</p>
<p>Das ist nur ein einfaches Beispiel der Integration von Webservices in andere
  Anwendungen.</p>
<p>Nachdem die grundlegende Funktion von Webservices gekl&auml;rt ist, m&uuml;ssen
  noch weitere Aspekte in Betracht gezogen werden, die sich insbesondere f&uuml;r
  den Programmierer ergeben, der von Webservices gebrauch machen m&ouml;chte.<br>
  Den woher wei&szlig; der Programmierer auf welche Funktionen er bei der Nutzung
  von Webservices zur&uuml;ckgreifen kann, bzw. welche Parameter diese brauchen.<br>
  Hierzu wurde von IBM und Microsoft gemeinsam die Webservice Description Language,
  kurz WSDL, entwickelt. Sie basiert auf XML und erm&ouml;glicht die standarisierte
  Beschreibung von Webservices &#8211; sie wird auch vom W3C als m&ouml;glicher
  Standard diskutiert.</p>
<p>Ein weiteres Problem, welches Auftritt ist, dass bei einer Vielzahl von Webservices
  unklar ist, wer &uuml;berhaupt was anbietet. Die Webservices m&uuml;ssen irgendwo
  verzeichnet sein. Idealerweise sollte der Webservicenutzer nur noch eine Anfrage
  an das Webserviceverzeichnis machen m&uuml;ssen; dieses leitet ihn dann direkt
  weiter an den f&uuml;r die Anfrage passenden Webservice. Ein solches &quot;Telefonbuch&quot;
  f&uuml;r Webservices wurde durch UDDI (Universal Description, Discovery and
  Integration) geschaffen. In ihm sind die Webservice Anbieter und die von ihnen
  angebotenen Webservices verzeichnet. Bereits viele Anbieter haben UDDI implementiert.</p>
<p>Doch was f&uuml;r Chancen oder Zukunftsaussichten liegen in Webservices? Der
  Nutzen f&uuml;r Unternehmen ist eindeutig, da sie bei ihren Anwendungen einfach
  gesagt, nicht mehr alles selbst programmieren m&uuml;ssen. Die einzelnen Firmen
  werden sich durch ihre Webservices st&auml;rker als bisher vernetzen und so
  insbesondere in den Beziehungen zu den Kunden verbessern.</p>
<h3>Doch was bedeutet das f&uuml;r den Internetnutzer? </h3>
<p>Eine Vision ist, dass man &uuml;ber Webservices eine Personalisierung des ganzen
  Internets einf&uuml;hren kann. So hat Microsoft bereits &uuml;ber ihr .NET Passport
  einen ersten Schritt dahingehend getan. &Uuml;ber einen .NET Passport kann man
  auf die verschiedensten Angebote von Microsoft zugreifen ohne jedes Mal ein
  neuen Account anlegen zu m&uuml;ssen. Das hei&szlig;t man m&uuml;sste seine
  pers&ouml;nlichen Daten nur noch in einem virtuellen Pass hinterlegen, &uuml;ber
  welchen man dann auf die verschiedensten Internetdienste zur&uuml;ckgreifen
  kann. <br>
  Dies wird jedoch auch heftig diskutiert, da damit erhebliche Sicherheitsbedenken
  verbunden sind. </p>
<p>Webworker selbst k&ouml;nnen Webservices bisher nur in beschr&auml;nkten Ma&szlig;e
  nutzen. Bei den in diesem Workshop betrachteten Webservices von Google und Amazon
  k&ouml;nnen Webworker auf die Produktpalette von Amazon bzw. auf die Suchfunktion
  von Google zur&uuml;ckgreifen und diese in die eigene Webseite integrieren.
  Es bleibt also noch zu erwarten in wie weit Webservices das Leben eines Webworkers
  beeinflussen wird &#8211; im Rahmen dieses Workshops soll der Nutzen der beiden
  betrachteten Webservices f&uuml;r den Webworker in den Vordergrund gestellt
  werden.</p>
<p>(<a href="/informationen/autoren.htm">tf</a>) </p></p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/php/63-workshop-einfhrung-in-webservices.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eigene Web Services mit PHP5 bereitstellen? Kein Problem!</title>
		<link>http://www.devmag.net/php/69-eigene-web-services-mit-php5-bereitstellen-kein-problem.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=eigene-web-services-mit-php5-bereitstellen-kein-problem</link>
		<comments>http://www.devmag.net/php/69-eigene-web-services-mit-php5-bereitstellen-kein-problem.html#comments</comments>
		<pubDate>Wed, 05 Nov 2008 10:00:00 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webservices]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=69</guid>
		<description><![CDATA[Weiterf&#252;hrende Links:Wikipedia für die eigene Webseite – Teil 1 Wikipedia für die eigene Webseite – Teil 2 Komprimierte HTML Dateien mit PHP


Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/43-wikipedia-fur-die-eigene-webseite-teil-1.html' rel='bookmark' title='Permanent Link: Wikipedia für die eigene Webseite – Teil 1'>Wikipedia für die eigene Webseite – Teil 1</a></li>
<li><a href='http://www.devmag.net/php/44-wikipedia-fur-die-eigene-webseite-teil-2.html' rel='bookmark' title='Permanent Link: Wikipedia für die eigene Webseite – Teil 2'>Wikipedia für die eigene Webseite – Teil 2</a></li>
<li><a href='http://www.devmag.net/php/47-komprimierte-html-dateien-mit-php.html' rel='bookmark' title='Permanent Link: Komprimierte HTML Dateien mit PHP'>Komprimierte HTML Dateien mit PHP</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.devmag.net/wp-content/uploads/illu_php_soap_webservices.gif" class="illu" width="60" height="60" align="left" alt="PHP - Eigene Web Services mit PHP5 bereitstellen? Kein Problem!" />
PHP5 bietet das nötige Rüstzeug, um bequem und schnell eigene Web Services auf die Beine zu stellen. Ein Einblick, wie das funktioniert, bietet dieses Tutorial.<span id="more-69"></span>            <P>Eigene Web Services mit PHP5 bereitstellen? Kein Problem! Bietet PHP5 doch das nötige Rüstzeug, um bequem und schnell den eigenen Web Service auf die Beine zu stellen. Doch was, wenn der Client nicht in PHP geschrieben sein soll? Soll Ihr Firefox Plugin auf Webservices zugreifen können oder Sie möchten Ihren Kunden ein ansprechendes Administrationsfrontend zu Ihrem CMS anbieten? Dieses Tutorial erklärt die Erstellung eines Soap Servers mit PHP5 und des dazugehörigen Clients in Javascript.</P>

<div style="border: 1px #000000 dotted;">Markus Bopp ist Student  der Informatik an der Fachhochschule-Bonn-Rhein-Sieg. Neben dem Studium ist er freiberuflich f&uuml;r verschiedene Unternehmen als Web-Entwickler t&auml;tig. Seine Homepage finden Sie unter <a href="http://www.php-projekte.de" target="_blank">php-projekte.de</a>.<br />
</div>

          <h2> Was ist Soap? </h2>

<p>Soap (Simple Object Access Protocol) ist ein einfaches XML basiertes Protokoll, mit der Anwendungen Informationen über HTTP austauschen können. Das interessante an Soap ist, dass Sprachübergreifend Objekte und deren sichtbare Eigenschaften über das WWW übertragen und individuell aufbereitet werden können (Stichwort WebServices). Ein berühmter Vertreter, der eine Soap Schnittstelle zur Verfügung stellt, ist Amazon. Mit Amazon’s Soap-Schnittstelle kann man z.B. auf der eigenen Homepage Amazon Angebote nach eigenem Gutdünken platzieren. Es gibt jedoch eine Vielzahl weiterer Verwendungsmöglichkeiten, nicht nur im Bereich der Content-Syndication, die dem blossen Inkludieren von Fremden Seiten oder RSS-Feeds haushoch überlegen sind.</p>

<p>PHP5 bietet nun eine eingebaute Extension, um beliebig Soap Server oder Clients zu erstellen. Es gibt noch weitere Soap Implementationen für PHP (z.B. über PEAR), jedoch sind diese meist in PHP verfasst und somit von der Performance her einer in C geschriebenen Extension unterlegen. </p>


<h2>Was brauche ich denn so? </h2>

<p>Zunächst empfiehlt sich das PHP5 "Rundum-Sorglos-Paket" XAMPP.</p>

<p>Mit XAMPP kann man sich unter Windows und Linux im Handumdrehen eine PHP5 Testumgebung schaffen und die hier bereitgestellten Code-Beispiele ausprobieren. Nach der Installation von XAMPP muss die Soap-Extension in der php.ini aktiviert werden. Falls Sie kein XAMPP verwenden und nicht wissen, welche php.ini gerade benutzt wird, dann erstellen Sie eine PHP Datei mit untenstehendem Inhalt, kopieren diese in Ihr Document Root und öffnen die Datei im Browser. Falls Sie XAMPP verwenden, können Sie im XAMPP Menu den Punkt "phpinfo()" auswählen. Dort steht in der Zeile "Configuration File (php.ini) Path" der Pfad zur php.ini, die Sie anpassen müssen. </p>
<code>
&lt;?
phpinfo();
?&gt;
</code>
<p>
In der php.ini suchen Sie dann nach der Zeile ";extension=php_soap.dll", entfernen das ";", speichern ab und starten den Apachen neu.

Als nächstes benötigen wir noch Firefox, um unseren Client zu testen (alternativ funktioniert natürlich auch die Mozilla-Suite).

Ein einfacher ASCII-Text Editor reicht für die Beispiele vollkommen aus. </p>

<h2>Der Soap Server </h2>

<p>Um einen Soap Server mit PHP5 zu erstellen, haben wir zwei Möglichkeiten. Einmal einen Soap Server mit WSDL Defintionsdatei und einmal einen Server ohne. Eine WSDL Datei (Web Services Description Language) ist eine von XML abgeleitete Beschreibungssprache, um Funktions- bzw. Methodenaufrufe und Datentypen zu definieren. Für den Soap Server ist eine WSDL Datei nicht zwingend notwendig, sollte aber bei steigender Komplexität der Webservices auf jeden Fall eingesetzt werden. Nötig wird eine WSDL Datei spätestens dann, wenn die Datenübertragung mit SSL verschlüsselt werden soll. Denn diese Angabe muss explizit in der WSDL Datei vorhanden sein. Ausserdem gibt es Tools, z.B. für Java, die aus WSDL Dateien Programmcode erzeugen. Dies ist für das Rapid-Prototyping eine äusserst nützliche Hilfe. Ein gutes Tool, um WSDL Dateien On-The-Fly zu erzeugen ist der SOA-Editor. </p>

<p>Wir werden in diesem Teil die Möglichkeit ohne WSDL Dateien behandeln. </p>

<p>Öffnen Sie eine leere Datei und speichern Sie diese als "soap_server.php" in Ihrem Document Root ab. Kopieren Sie nun folgenden Code in die Datei und speichern: </p>

<code>
&lt;? <br>// Die Methoden in dieser Klasse werden weiter unten als Soap Service bereit gestellt <br>
require_once('MySoapClass.php'); <br><br>

// Den WSDL Cache abschalten <br>
ini_set("soap.wsdl_cache_enabled", "0"); <br>

/* <br>
    Erzeugt eine neue SoapServer Instanz. Der erste Parameter (null) bedeutet, dass keine WSDL Datei verwendet werden soll. <br>
    Wenn keine WSDL Datei angegeben wird, muss die uri Option gesetzt sein. <br>
*/ <br>
$server = new SoapServer(null, array('uri' => "http://localhost/")); <br><br>

/* <br>
    Bestimmt, dass alle öffentlichen Funktionen der Klasse MySoapClass für den Client erreichbar sein sollen <br>
*/ <br>
$server->setClass("MySoapClass"); <br><br>

/* <br>
    Behandelt den Soap Request des Clients. Die Antwort wird in XML "verpackt" und an den Client zurückgeschickt <br>
*/ <br>
$server->handle();?&gt;  <br>
</code>
<p>Öffnen Sie eine leere Datei und speichern Sie diese als "MySoapClass.php" im selben Ordner des Documents Roots ab, indem Sie die "soap_server.php" abgespeichert haben. Kopieren Sie nun folgenden Code in die Datei und speichern: </p>
<code>

&lt;? <br>
/* <br>
    Testklasse mit einigen Funktionen, die über den Soap Client erreichbar sein sollen. <br><br>

    Die für den Soap Server bereitgestellte Klasse MySoapClass erzeugt ein Objekt vom Typ <br>
    MyAttributesClass. Dieses Objekt kann dann vom Client über die Funktion MySoapClass::getAttributesClass() <br>
    empfangen werden. <br>

    Mit der Funktion MySoapClass::provokeSoapFault() lässt sich ein Beispiel Soap Fehler erzeugen. <br>
    Der Fehler wird dann als Warnung im Client zu sehen sein. <br>
*/ <br><br>

class MySoapClass { <br>

    public $myAttributesClass = null; <br><br>

    public function __construct() { <br><br>
        $this->myAttributesClass = new MyAttributesClass(); <br>
    } <br><br>

    public function getAttributesClass() {<br>
        return $this->myAttributesClass;     <br>
    } <br><br>

    public function putSomethingToServer($something) {<br>
        return new SoapFault('Info','Sie haben folgendes zum Soap Server geschickt: ' . $something); <br>
    }<br>
} <br>

class MyAttributesClass {<br>
    public $attrib1 = 'Inhalt 1'; <br>
    public $attrib2 = 'Inhalt 2'; <br>
    public $attrib3 = 'Inhalt 3'; <br>
    public $attrib4 = 'Inhalt 4'; <br>
    public $attrib5 = 'Inhalt 5'; <br>
}<br>
?&gt;
</code>
<p>
In der "soap_server.php" haben wir nun festgelegt, dass keine WSDL Datei verwendet wird und dass die Funktionen der Klasse MySoapClass dem Client zur Verfügung stehen sollen. Die Klasse MySoapClass in "MySoapClass.php" stellt den eigentlichen Service dar. Hier werden dem Client die Funktionen MySoapClass::getAttributesClass() und MySoapClass::putSomethingToServer($something) bereit gestellt. Erstere Funktion übergibt dem Client eine Instanz der Klasse MyAttributesClass. Alle öffentlichen Eigenschaften, werden dann vom Client weiterbehandelt. Die zweite Funktion zeigt, dass selbstverständlich auch Parameter an eine Soap Funktion übergeben werden können.
</p>
<h2>Der Soap Client </h2>

<p>Um den Rahmen dieses Tutorials nicht zu sprengen, liegt Ihnen eine vorgefertigte und einfach zu verwendende Javascript Klasse zur Steuerung des Soap Clients vor. Diese Klasse habe ich im Rahmen meines CM Frameworks erstellt, um bequemer Anfragen an den Soap Server stellen zu können. </p>

<p>Öffnen Sie eine leere Datei und speichern Sie diese als "BlasterSoapClient.js" ab. Allerdings brauchen Sie dies nicht im Document Root zu tun. Sie erfahren später wieso. Kopieren Sie folgenden Code in die Datei und speichern: </p>
<p><code>/** <br />
  * The SoapClient Class <br />
  */ <br />
  function   BlasterSoapClient() {<br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.transportURI = ''; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.urn =   'urn:noxmethods';&nbsp;&nbsp;&nbsp;&nbsp; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.enablePrivilege = 'UniversalBrowserRead'; <br />
  }&nbsp;&nbsp; <br />
  <br />
  /* <br />
  *&nbsp;&nbsp;&nbsp;&nbsp;Method BlasterSoapClient::asyncInvoke() does not   halt script when receiving result! <br />
  */ <br />
  BlasterSoapClient.prototype.asyncInvoke = function (method,args,callback){ <br />
  &nbsp;&nbsp;&nbsp;&nbsp;try { <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;netscape.security.PrivilegeManager.enablePrivilege(this.enablePrivilege); <br />
  &nbsp;&nbsp;&nbsp;&nbsp;} catch (e) { <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(e); <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;} <br />
  &nbsp;&nbsp;&nbsp;&nbsp; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;var soapCall = new SOAPCall(); <br />
  &nbsp;&nbsp;&nbsp;&nbsp;var prot =   BlasterSoapClient.prototype; <br />
  &nbsp;&nbsp;&nbsp;&nbsp; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;soapCall.transportURI =   this.transportURI; <br />
  &nbsp;&nbsp;&nbsp;&nbsp; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;var params = new Array(args.length); <br />
  &nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;args.length;i++){ <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;params[i] = new   SOAPParameter(args[i],'') <br />
  &nbsp;&nbsp;&nbsp;&nbsp;} <br />
  &nbsp;&nbsp;&nbsp;&nbsp; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;soapCall.encode(0, method,   this.urn, 0, null, params.length, params); <br />
  &nbsp;&nbsp;&nbsp;&nbsp; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;soapCall.asyncInvoke( <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function (response, soapcall, error) <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var r =   prot.handleSOAPResponse(response,soapcall,error); <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;callback(r); <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
  &nbsp;&nbsp;&nbsp;&nbsp;); <br />
  }; <br />
  <br />
  /* <br />
  *&nbsp;&nbsp;&nbsp;&nbsp;Response handler for   BlasterSoapClient::asyncInvoke() <br />
  */ <br />
  BlasterSoapClient.prototype.handleSOAPResponse = function   (response,call,error) <br />
  { <br />
  &nbsp;&nbsp;&nbsp;&nbsp;if (error != 0) <br />
  &nbsp;&nbsp;&nbsp;&nbsp;{ <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw   &quot;Service failure&quot;; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;} else <br />
  &nbsp;&nbsp;&nbsp;&nbsp;{ <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var fault =   response.fault; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (fault != null) { <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var code =   fault.faultCode; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var msg = fault.faultString; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw &quot;SOAP Fault:\n\n&quot; + <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;Code: &quot;&nbsp;&nbsp;+ code + <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;\n\nMessage: &quot; + msg <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return response; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
  &nbsp;&nbsp;&nbsp;&nbsp;} <br />
  &nbsp;&nbsp;&nbsp;&nbsp; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;throw   &quot;Failure&quot;; <br />
  }; <br />
  <br />
  /* <br />
  * When using this, all scripts will halt until   result could be retrieved <br />
  */ <br />
  BlasterSoapClient.prototype.invoke =   function (func, args) <br />
  { <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try { <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;netscape.security.PrivilegeManager.enablePrivilege(this.enablePrivilege); <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (e) { <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw e; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;} <br />
  &nbsp;&nbsp;&nbsp;&nbsp; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var soap_call = new SOAPCall(); <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;soap_call.transportURI =   this.transportURI; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var p = new Array(args.length); <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;args.length;i++){ <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p[i] = new   SOAPParameter(args[i],''); <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;soap_call.encode(0, func, this.urn, 0, null, p.length, p); <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var temp = soap_call.invoke(); <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if   (temp.fault) {<br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw 'Code: ' + temp.fault.faultCode + '\n   String: ' + temp.fault.faultString; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else { <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var   response = new Array(); <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response = temp.getParameters(false, {}); <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return response[0].value; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
  } <br />
  <br />
  /* <br />
  *   User defineable method to handle result when asyncInvoke() is called. add it as   third param there! <br />
  */ <br />
  BlasterSoapClient.prototype.showResults = function   (results) <br />
  { <br />
  &nbsp;&nbsp;&nbsp;&nbsp;if (!results) <br />
  &nbsp;&nbsp;&nbsp;&nbsp;{ <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;} <br />
  &nbsp;&nbsp;&nbsp;&nbsp; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;var params = results.getParameters(false,{}); <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(params[0].value); <br /></code>
}; </p>
<p>&Ouml;ffnen Sie eine leere Datei und speichern Sie diese als &quot;soap_client_getattrib.html&quot; im selben Ordner ab, indem Sie die Datei &quot;BlasterSoapClient.js&quot; abgespeichert haben. Kopieren Sie folgenden Code in die Datei und speichern:</p>
<p><code>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0   Transitional//EN&quot;&gt; <br />
  &lt;html&gt; <br />
  &lt;head&gt; <br />
  &lt;title&gt;Ein   Soap Client in Javascript&lt;/title&gt;<br />
  &lt;!-- Die Soap Klasse   einbinden --&gt; <br />
  &lt;script type=&quot;text/javascript&quot;   src=&quot;BlasterSoapClient.js&quot;&gt;&lt;/script&gt;<br />
  &lt;/head&gt; <br />
  &lt;body&gt;<br />
  &lt;script&gt; <br />
  // neue Instanz des Soap Clients   erzeugen <br />
  var soapClient = new BlasterSoapClient(); <br />
  <br />
  // Webpfad zum   SoapServer <br />
  soapClient.transportURI = 'http://localhost/soap_server.php'; <br />
  &nbsp;&nbsp;&nbsp; <br />
  try{ <br />
  &nbsp;&nbsp;&nbsp;&nbsp;// Parameter Array erzeugen. Da wir keine Parameter in   der Funkion des Soap Servers erwarten, hat das Array die l&auml;nge null. <br />
  &nbsp;&nbsp;&nbsp;&nbsp;var   p = new Array(0); <br />
  &nbsp;&nbsp;&nbsp;&nbsp; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;// Aufruf (invoke) der Funktion   MySoapClass::getAttributesClass() auf dem SoapServer <br />
  &nbsp;&nbsp;&nbsp;&nbsp;var attributesClass   = soapClient.invoke('getAttributesClass',p); <br />
  &nbsp;&nbsp;&nbsp;&nbsp; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;// die Ausgabe   sollte [object SOAPPropertyBag] lauten <br />
  &nbsp;&nbsp;&nbsp;&nbsp;document.writeln(attributesClass+'&lt;br /&gt;&lt;br /&gt;'); <br />
  &nbsp;&nbsp;&nbsp;&nbsp; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;// ausgabe der eigenschaften des Objekts MyAttributesClass <br />
  &nbsp;&nbsp;&nbsp;&nbsp;document.writeln('Empfangen:&lt;br /&gt;'); <br />
  &nbsp;&nbsp;&nbsp;&nbsp;document.writeln(attributesClass.attrib1+'&lt;br /&gt;'); <br />
  &nbsp;&nbsp;&nbsp;&nbsp;document.writeln(attributesClass.attrib2+'&lt;br /&gt;'); <br />
  &nbsp;&nbsp;&nbsp;&nbsp;document.writeln(attributesClass.attrib3+'&lt;br /&gt;'); <br />
  &nbsp;&nbsp;&nbsp;&nbsp;document.writeln(attributesClass.attrib4+'&lt;br /&gt;'); <br />
  &nbsp;&nbsp;&nbsp;&nbsp;document.writeln(attributesClass.attrib5+'&lt;br /&gt;'); <br />
  &nbsp;&nbsp;&nbsp;&nbsp; <br />
  &nbsp;&nbsp;&nbsp;&nbsp; <br />
  } catch(e) {<br />
  &nbsp;&nbsp;&nbsp;&nbsp;alert(e); <br />
  } <br />
  &lt;/script&gt;<br />
  &lt;/body&gt; <br />
&lt;/html&gt; </code></p>
<p>&Ouml;ffnen Sie nun die Datei &quot;soap_client_getattrib.html&quot; mit dem   Mozilla Firefox Browser &uuml;ber &quot;Datei &ouml;ffnen&quot;. Sie werden dann darum gebeten, Ihr   Einverst&auml;ndnis f&uuml;r die Ausf&uuml;hrung des Soap Aufrufs zu erteilen. Warten Sie ein   paar Sekunden und klicken Sie dann auf &quot;Allow&quot;. Nun m&uuml;ssten Sie folgendes als   Ausgabe erhalten: </p>
<pre>[object SOAPPropertyBag]    <br />Empfangen:  <br />Inhalt 1  <br />Inhalt 2  <br />Inhalt 3  <br />Inhalt 4  <br />Inhalt 5  </pre>
<p>Wenn wir nun die Datei nicht &uuml;ber die &quot;Datei &ouml;ffnen&quot; Funktion   des Browsers, sondern &uuml;ber http://localhost/... aufgerufen h&auml;tten, dann w&auml;ren   die Sicherheitseinstellungen von Mozilla Firefox auf den Plan gerufen worden und   der Client h&auml;tte keine Antwort vom Soap Server erhalten. Das ist auch vollkommen   in Ordnung, denn ein Webserver soll dem Client keinen Soap Code unterjubeln   k&ouml;nnen, der dann beliebig Daten nachl&auml;dt. </p>
<p>Der Aufruf &quot;BlasterSoapClient.invoke('getAttributesClass',new   Array(0));&quot; bewirkt, dass der Client (sprich Mozilla Firefox) wartet, bis vom   Server eine R&uuml;ckmeldung kam. Daher ist die Verwendung von invoke auch nur dann   zu empfehlen, wenn nicht viele Daten hin und her transportiert werden sollen   (z.B. Login Prozeduren). F&uuml;r gr&ouml;ssere Datenmengen empfiehlt sich der Aufruf der   Funktion &quot;BlasterSoapClient.asyncInvoke(funktion,argumente,callbackfunktion)&quot;.   Der asynchrone Aufruf bewirkt, dass das Skript normal weiterl&auml;uft. Zur   Behandlung der empfangenen Daten wird jedoch eine Callback Funktion ben&ouml;tigt,   die dem Funktionsaufruf mitgegeben wird. Da bei Javascript Funktionen bereits   Objekte sind, k&ouml;nnen wir die Funktione direkt als Parameter an   &quot;BlasterSoapClient.asyncInvoke&quot; &uuml;bergeben. </p>
<p>F&uuml;r das Beispiel des asynchronen &uuml;bertragens von Daten mit   Soap &ouml;ffnen Sie eine leere Datei und speichern Sie diese als   &quot;soap_client_getattrib_async.html&quot; ab (im gleichen Ordner wie   &quot;soap_client_getattrib.html&quot;). Kopieren Sie folgenden Code in die Datei und   speichern: </p>
<p><code>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0   Transitional//EN&quot;&gt; <br />
  &lt;html&gt; <br />
  &lt;head&gt; <br />
  &lt;title&gt;Ein   Soap Client in Javascript&lt;/title&gt; <br />
  <br />
  &lt;!-- Die Soap Klasse   einbinden --&gt; <br />
  &lt;script type=&quot;text/javascript&quot;   src=&quot;BlasterSoapClient.js&quot;&gt;&lt;/script&gt; <br />
  <br />
  &lt;/head&gt; <br />
  &lt;body&gt; <br />
  <br />
  &lt;script&gt; <br />
  // neue Instanz des Soap Clients   erzeugen <br />
  var soapClient = new BlasterSoapClient(); <br />
  <br />
  // Webpfad zum   SoapServer <br />
  soapClient.transportURI = 'http://localhost/soap_server.php'; <br />
  &nbsp;&nbsp;&nbsp; <br />
  try{ <br />
  &nbsp;&nbsp;&nbsp;&nbsp;// Parameter Array erzeugen. Da wir keine Parameter in   der Funkion des Soap Servers erwarten, hat das Array die l&auml;nge null. <br />
  &nbsp;&nbsp;&nbsp;&nbsp;var   p = new Array(0); <br />
  &nbsp;&nbsp;&nbsp;&nbsp; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;// Aufruf (invoke) der Funktion   MySoapClass::getAttributesClass() auf dem SoapServer (asynchron) <br />
  &nbsp;&nbsp;&nbsp;&nbsp;soapClient.asyncInvoke('getAttributesClass',p,callbackHandler); <br />
  }   catch(e) { <br />
  &nbsp;&nbsp;&nbsp;&nbsp;alert(e); <br />
  } <br />
  <br />
  // der R&uuml;ckruf Handler f&uuml;r   asyncInvoke <br />
  function callbackHandler (results) <br />
  { <br />
  &nbsp;&nbsp;&nbsp;&nbsp;if (!results) <br />
  &nbsp;&nbsp;&nbsp;&nbsp;{ <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;} <br />
  &nbsp;&nbsp;&nbsp;&nbsp; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;var params =   results.getParameters(false,{}); <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var attributesClass =   params[0].value; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;alert(attributesClass+'\n' <br />
  &nbsp;&nbsp;&nbsp;&nbsp; +   'Empfangen:\n' <br />
  &nbsp;&nbsp;&nbsp;&nbsp; + attributesClass.attrib1+'\n' <br />
  &nbsp;&nbsp;&nbsp;&nbsp; +   attributesClass.attrib2+'\n' <br />
  &nbsp;&nbsp;&nbsp;&nbsp; + attributesClass.attrib3+'\n' <br />
  &nbsp;&nbsp;&nbsp;&nbsp; +   attributesClass.attrib4+'\n' <br />
  &nbsp;&nbsp;&nbsp;&nbsp; + attributesClass.attrib5+'\n'); <br />
  }; <br />
  &lt;/script&gt;<br />
  &lt;/body&gt; <br />
&lt;/html&gt;</code> </p>
<p>Wenn Sie nun das Beispiel im Browser &ouml;ffnen, dann sehen Sie, dass es im Grunde nur eine &Auml;nderung gab. Statt das Ergebnis das Aufrufs der Soap Funktion direkt in die Variable &quot;attributesClass&quot; zu speichern, geschieht dies beim asynchronen Aufruf erst in der Callback Funktion. Man kann bei gr&ouml;sseren Datenmengen leicht einen Ladebalken einbauen, damit der Benutzer sieht, dass im Hintergrund etwas passiert. Im folgenden werden wir der einfachheit halber mit der synchronen Variante fortfahren. </p>
<p>Nun wollen wir auf unserem Soap Server die Funktion &quot;MySoapClass::putSomethingToServer($something)&quot; ausf&uuml;hren und einen Parameter mit&uuml;bergeben. &Ouml;ffnen Sie eine leere Datei und speichern Sie diese als &quot;soap_client_putargs.html&quot; im selben Ordner ab, indem Sie die Datei &quot;BlasterSoapClient.js&quot; abgespeichert haben. Kopieren Sie folgenden Code in die Datei und speichern:</p>
<p><code>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0   Transitional//EN&quot;&gt; <br />
  &lt;html&gt; <br />
  &lt;head&gt; <br />
  &lt;title&gt;Ein   Soap Client in Javascript&lt;/title&gt;<br />
  &lt;!-- Die Soap Klasse   einbinden --&gt; <br />
  &lt;script type=&quot;text/javascript&quot;   src=&quot;BlasterSoapClient.js&quot;&gt;&lt;/script&gt;<br />
  &lt;/head&gt; <br />
  &lt;body&gt;<br />
  &lt;script&gt; <br />
  // neue Instanz des Soap Clients   erzeugen <br />
  var soapClient = new BlasterSoapClient(); <br />
  <br />
  // Webpfad zum   SoapServer <br />
  soapClient.transportURI = 'http://localhost/soap_server.php'; <br />
  &nbsp;&nbsp;&nbsp; <br />
  try{ <br />
  &nbsp;&nbsp;&nbsp;&nbsp;// Parameter Array erzeugen. Die Funktion des Soap   Server, die wir weiter unten aufrufen erwartet genau einen Parameter. <br />
  &nbsp;&nbsp;&nbsp;&nbsp;var p = ['Irgendein String']; <br />
  &nbsp;&nbsp;&nbsp;&nbsp; <br />
  &nbsp;&nbsp;&nbsp;&nbsp;// Aufruf (invoke) der   Funktion MySoapClass::putSomethingToServer($something) auf dem SoapServer <br />
  &nbsp;&nbsp;&nbsp;&nbsp;soapClient.invoke('putSomethingToServer',p); <br />
  &nbsp;&nbsp;&nbsp;&nbsp; <br />
  } catch(e) { <br />
  &nbsp;&nbsp;&nbsp;&nbsp;alert(e); <br />
  } <br />
  &lt;/script&gt;<br />
  &lt;/body&gt; <br />
&lt;/html&gt; </code></p>
<p>Der Parameter mit dem Inhalt &quot;Irgendein String&quot; wurde nun an &quot;MySoapClass::putSomethingToServer($something)&quot; &uuml;bergeben und es wurde ein SoapFault Objekt an den Client zur&uuml;ckgeschickt mit dem Inhalt der Nachricht. SoapFaults sind wichtig, um Fehler, die auf dem Server passiert sind (z.B. Eingabefehler, Exceptions etc.) dem Client mitzuteilen. Das heisst, der Client braucht nicht auf die Antwort warten und man kann sich Tests sparen, in denen gepr&uuml;ft wird ob alle Values auch wirklich angekommen sind. </p>
<p>Ich hoffe, Ihnen hat meine kleine Einf&uuml;hrung in PHP5/Javascript SOAP gefallen. Im zweiten Teil werden wir sehen, wie die &uuml;ber den Client empfangenen Daten mit XUL verwendet werden k&ouml;nnen und besch&auml;ftigen uns n&auml;her mit WSDL. </p>
(<a href="/informationen/autoren.htm">mb</a>) </p></p>


<p>Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/43-wikipedia-fur-die-eigene-webseite-teil-1.html' rel='bookmark' title='Permanent Link: Wikipedia für die eigene Webseite – Teil 1'>Wikipedia für die eigene Webseite – Teil 1</a></li>
<li><a href='http://www.devmag.net/php/44-wikipedia-fur-die-eigene-webseite-teil-2.html' rel='bookmark' title='Permanent Link: Wikipedia für die eigene Webseite – Teil 2'>Wikipedia für die eigene Webseite – Teil 2</a></li>
<li><a href='http://www.devmag.net/php/47-komprimierte-html-dateien-mit-php.html' rel='bookmark' title='Permanent Link: Komprimierte HTML Dateien mit PHP'>Komprimierte HTML Dateien mit PHP</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/php/69-eigene-web-services-mit-php5-bereitstellen-kein-problem.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

