{"id":37,"date":"2007-08-30T21:37:18","date_gmt":"2007-08-30T19:37:18","guid":{"rendered":"http:\/\/joergnapp.de\/2007\/08\/30\/ein-einfacher-soap-server-in-php\/"},"modified":"2009-07-02T20:22:44","modified_gmt":"2009-07-02T18:22:44","slug":"ein-einfacher-soap-server-in-php","status":"publish","type":"post","link":"https:\/\/joergnapp.de\/blog\/ein-einfacher-soap-server-in-php\/","title":{"rendered":"Ein einfacher SOAP-Server in PHP"},"content":{"rendered":"<p>Die Aufgabe ist eigentlich einfach: Zu einer gegebenen Eingabe sollen bestimmte Parameter aus einer Datenbank gezogen und der anfragenden Anwendung zur Verf\u00fcgung gestellt werden. Diese Anwendung ist in meinem Falle Word, die Datenbank, aus der die Abfrage stammt, ist eine MySQL-Datenbank auf einem Web-Server, und die Installation eines entsprechenden Datenbanktreibers kommt aus bestimmten Gr\u00fcnden nicht infrage.<\/p>\n<p><!--more--><\/p>\n<p>Die erste L\u00f6sung der Aufgabe \u2013 ein <acronym title=\"Hypertext Preprocessor\">PHP<\/acronym>-Skript schickt die Ausgabe per Trennzeichen geschickt als <acronym title=\"HyperText Markup Language\">HTML<\/acronym>-Ausgabe, und Word muss dann anhand des Trennzeichens die Werte wieder auseinander nehmen \u2013 war so h\u00e4sslich, dass ich mich daran gemacht habe, das ganze als Web Service mit <acronym title=\"Simple Object Access Protocol\">SOAP<\/acronym> zu realisieren.<\/p>\n<h2>Grundger\u00fcst<\/h2>\n<p>Die eigentliche Suchfunktion (also die Datenbankabfrage) ist wenig spektakul\u00e4r:<\/p>\n<pre><code>\r\nfunction suche($suchbegriff)\r\n{\r\n    mysql_connect('localhost', 'user', 'password') or die('Could not connect: ' . mysql_error());\r\n    mysql_select_db('datenbank');\r\n\r\n    $SQL = \"SELECT DISTINCT ergebnis FROM tabelle WHERE suchspalte LIKE '%$suchbegriff%'\";\r\n\r\n    $result = mysql_query($SQL);\r\n    $ergebnisse = array();\r\n    while ($row = mysql_fetch_array($result, MYSQL_NUM)) {\r\n        $ergebnisse[] = $row[0];\r\n    } \r\n\r\n    mysql_free_result($result);\r\n    return $ergebnisse;\r\n}\r\n<\/code><\/pre>\n<p>(Das ist nat\u00fcrlich nicht der korrekte Code; insbesondere eine Wertepr\u00fcfung von $suchbegriff fehlt!)<\/p>\n<h2>SOAP-Unterbau<\/h2>\n<p>Die verwendete <acronym title=\"Hypertext Preprocessor\">PHP<\/acronym>-Version verf\u00fcgte leider nicht \u00fcber die <acronym title=\"Simple Object Access Protocol\">SOAP<\/acronym>-Erweiterung, sodass ich mich nach einer externen Bibliothek umsehen musste. Die <a href=\"http:\/\/dietrich.ganx4.com\/nusoap\/\" class=\"urlextern\" title=\"http:\/\/dietrich.ganx4.com\/nusoap\/\" rel=\"nofollow\">NuSOAP<\/a>-Bibliothek schien mir hierf\u00fcr geeignet, obwohl die letzte bei Sourceforge herunterladbare Version von 2005 ist.Tats\u00e4chlich lies sich damit der ben\u00f6tigte Webservice sehr einfach gestalten:Zun\u00e4chst m\u00fcssen nat\u00fcrlich die Bibliotheken eingebunden werden und der Server initialisiert werden:<\/p>\n<pre><code>\r\nrequire_once('nusoap\/nusoap.php');\r\n$server = new soap_server;\r\n<\/code><\/pre>\n<p>Anschlie\u00dfend teilen wir dem Server mit, dass wir auch WSDL anbieten wollen. WSDL ist eine Beschreibung der durch den Webservice angebotenen Funktionen, Datentypen usw.<\/p>\n<pre><code>\r\n$server-&gt;configureWSDL('suche');\r\n<\/code><\/pre>\n<p>Der R\u00fcckgabewert unserer Funktion ist ein Array, un der <acronym title=\"Simple Object Access Protocol\">SOAP<\/acronym>-Diktion ein komplexer Typ, der entsprechend definiert wird:<\/p>\n<pre><code>\r\n\/\/ register \"array\" type\r\n$server-&gt;wsdl-&gt;addComplexType('ArrayOfString',\r\n                              'complexType',\r\n                              'array',\r\n                              '',\r\n                              'SOAP-ENC:Array',\r\n                              array(),\r\n                              array(array('ref'            =&gt; 'SOAP-ENC:arrayType',\r\n                                          'wsdl:arrayType' =&gt; 'xsd:string[]'\r\n                                         )\r\n                                   ),\r\n                              'xsd:string'\r\n                             );\r\n<\/code><\/pre>\n<p>Die Funktionen, die per <acronym title=\"Simple Object Access Protocol\">SOAP<\/acronym> genutzt werden d\u00fcrfen, m\u00fcssen nun noch registriert werden. Damit wird erreicht, dass wirklich nur die gew\u00fcnschten Funktionen \u201evon au\u00dfen\u201c zug\u00e4nglich sind (anderenfalls w\u00e4re mit erheblichen Sicherheitsproblemen zu rechnen\u2026)<\/p>\n<pre><code>\r\n\/\/ register the lookup service\r\n$server-&gt;register('suche',\r\n                  array('inputString' =&gt; 'xsd:string'),\r\n                  array('return'      =&gt; 'tns:ArrayOfString'));\r\n<\/code><\/pre>\n<p>Die eigentliche Arbeit \u00fcbernehmen nun die Zeilen<\/p>\n<pre><code>\r\n$HTTP_RAW_POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : '';\r\n$server-&gt;service($HTTP_RAW_POST_DATA);\r\n<\/code><\/pre>\n<p>Diese sorgen daf\u00fcr, dass die im <acronym title=\"Hyper Text Transfer Protocol\">HTTP<\/acronym>-Request angegebenen Befehle abgearbeitet werden und die Ergebnisse zur\u00fcckgegeben werden.<\/p>\n<h2>Fazit<\/h2>\n<p>Mit NuSOAP ist es in der Tat sehr simpel, eine \u201eohnehin vorhandene\u201c Funktion als einen Webservice bereitzustellen. In weiteren Artikeln werde ich noch darauf eingehen, wie man diesen Webservice dann auch nutzen kann (mit NuSOAP, <acronym title=\"Visual Basic\">VB<\/acronym>.net und \u2013 der urspr\u00fcnglichen Aufgaben entsprechend \u2013 von Word aus).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Aufgabe ist eigentlich einfach: Zu einer gegebenen Eingabe sollen bestimmte Parameter aus einer Datenbank gezogen und der anfragenden Anwendung zur Verf\u00fcgung gestellt werden. Diese Anwendung ist in meinem Falle Word, die Datenbank, aus der die Abfrage stammt, ist eine MySQL-Datenbank auf einem Web-Server, und die Installation eines entsprechenden Datenbanktreibers kommt aus bestimmten Gr\u00fcnden nicht &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/joergnapp.de\/blog\/ein-einfacher-soap-server-in-php\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eEin einfacher SOAP-Server in PHP\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[24,35,14,94,15,96,4,12,182],"class_list":["post-37","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-html","tag-mysql","tag-php","tag-sicherheit","tag-soap","tag-treiber","tag-visual-basic","tag-webservices","tag-word"],"_links":{"self":[{"href":"https:\/\/joergnapp.de\/blog\/wp-json\/wp\/v2\/posts\/37","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/joergnapp.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/joergnapp.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/joergnapp.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/joergnapp.de\/blog\/wp-json\/wp\/v2\/comments?post=37"}],"version-history":[{"count":0,"href":"https:\/\/joergnapp.de\/blog\/wp-json\/wp\/v2\/posts\/37\/revisions"}],"wp:attachment":[{"href":"https:\/\/joergnapp.de\/blog\/wp-json\/wp\/v2\/media?parent=37"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/joergnapp.de\/blog\/wp-json\/wp\/v2\/categories?post=37"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/joergnapp.de\/blog\/wp-json\/wp\/v2\/tags?post=37"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}