SOAP Webservice Problem

S

scaerry

Hallo zusammen, ich brauche dringend Hilfe, denn ich weiß nicht was ich tue ;)

bin ganz neu im Gebiet Webservices. Ich habe schon dieses Tutorial hier http://www.tutorials.de/forum/php-tutorials/166733-php5-einstieg-soap.html gemacht und das hat auch funktioniert. Jetzt bin ich soweit, dass ich selber herumspielen will, was aber leider ganz und garnicht funktioniert. Letztendlich möchte ich, dass ich anhand einer WSDL Beschreibung eine Funktion auf dem Server aufrufen kann, die mir eine XML Datei mit Daten aus einer Datenbank erstellt.

Dazu habe ich folgende Dateien:
artikel.wsdl
Code:
<?xml version ="1.0"?> 

<!-- WSDL-Beschreibung der Artikeldaten -->
             
<definitions name="artikel" 
  xmlns:typens="http://localhost/soap/artikel.wsdl" 
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  xmlns="http://schemas.xmlsoap.org/wsdl/"> 

  <!-- Messages.. -->
  <message name="createXMLRequest">
    <part name="request"  type="xsd:int"/>
  </message> 
  
  <message name="createXMLResponse"> 
    <part name="response" type="xsd:int"/>
  </message>
  
  <!-- PortType.. -->
  <portType name="artikelPort">
    <operation name="createXML">
      <input message="typens:createXMLRequest"/>
      <output message="typens:createXMLResponse"/>
    </operation>
  </portType>
  
  <!-- Bindings -->
  <binding name="artikelBinding" type="typens:artikelPort">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="createXML">
      <soap:operation soapAction="urn:artikelAction#createXML"/>
      <input>
        <soap:body use="encoded" namespace="urn:artikelAction" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </input>
      <output>
        <soap:body use="encoded" namespace="urn:artikelAction" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </output>
    </operation>
  </binding>
  
  <!-- Ende -->
  <service name="artikelService">
    <port name="artikelPort" binding="typens:artikelBinding">
    <soap:address location="urn:artikel"/>
    </port>
  </service>
  
</definitions>

server.php
Code:
<?php

function createXML($zahl1)
{
   if ($zahl1 == 1)
   {
   require("dbinfo.php");

   // Start XML Datei
   $dom     = new DOMDocument('1.0', 'iso-8859-1');
   $comment = $dom->appendChild(new DOMComment('Artikeldaten'));
   $node = $dom->createElement("Artikeldaten");
   $parnode = $dom->appendChild($node);

   // Opens a connection to a MySQL server
   $connection=mysql_connect (localhost, $username, $password);
   if (!$connection) {  die('Not connected : ' . mysql_error());}

   // Set the active MySQL database
   $db_selected = mysql_select_db($database, $connection);
   if (!$db_selected) {
     die ('Can\'t use db : ' . mysql_error());
   }

   // Select all the rows in the markers table
   $query = "SELECT * FROM markers WHERE 1";
   $result = mysql_query($query);
   if (!$result) {
     die('Invalid query: ' . mysql_error());
   }

   header("Content-type: text/xml");

   // Iterate through the rows, adding XML nodes for each
   while ($row = @mysql_fetch_assoc($result))
   {
     // ADD TO XML DOCUMENT NODE
     $node = $dom->createElement("Artikel");
     $newnode = $parnode->appendChild($node);
     $newnode->setAttribute("name",$row['name']);
     $newnode->setAttribute("address", $row['address']);
     $newnode->setAttribute("lat", $row['lat']);
     $newnode->setAttribute("lng", $row['lng']);
     $newnode->setAttribute("type", $row['type']);
   }

   // echo $dom->saveXML();
   echo $dom->save("artikeldaten.xml"); 

   return 1;

   }
   else
   {
   return 0;
   }
}

$server = new SoapServer(NULL,
 array('uri' => "http://localhost/soap/"));
$server->addFunction('createXML');
$server->handle();

?>

client.php
Code:
<?php

$client = new SoapClient('http://localhost/soap/artikel.wsdl', array('exceptions' => 0));

$result = $client->createXML(1);

if(is_soap_fault($result))
{
    echo "FehlerCode: " . $result->faultcode . "<br>\n";
    echo "Beschreibung: " . $result->faultstring . "<br>\n";
    echo "Sender: " . $result->faultactor . "<br>\n";
}
else
{
    echo $result;
}


?>

Die Funktion mit dem XML erstellen klappt schon, das habe ich bereits in einem normalen Programm getestet. Wenn ich das ganze dann über client.php ausführe, bekomme ich folgende Ausgabe:
Code:
FehlerCode: Client
Beschreibung: DTD are not supported by SOAP
Sender:

Bitte helft mir :confused:
 
Leider kann ich keine genauen Angaben machen, aber es sieht erstmal so aus als wäre deine Location falsch

Code:
<soap:address location="urn:artikel"/>

Und die Fehlermeldung sagt eigentlich das in deiner Document Type Definition was falsch ist. Was die Location sein könnte...

Und dann vielleicht mal die exceptions auf 1 setzten und nicht unterdrücken, vielleicht kommt ja schon vorher was raus.

Mehr kann ich leider nicht dazu sagen, da SOAP nicht gerade mein Thema ist.
 
Zurück