Ankündigung

Einklappen
Keine Ankündigung bisher.

Über SOAP Arrays bzw. Complex Types zurückgeben

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Über SOAP Arrays bzw. Complex Types zurückgeben

    Hallo,

    ich möchte einen eigenen Webservice unter php5/SOAP aufsetzen. WSDL ist erstellt und funzt soweit. Ich möchte Arrays verwenden. Hier meine Operation und ComplexType in der WSDL-Datei:


    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    
    
    
    
    
    <wsdl:definitions name="shopAPI" targetNamespace="http://localhost/shopapp/info"
    	xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/'
    	xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://localhost/shopapp/info"
    	xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    	xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    
    
    
    
    	<wsdl:types>
    		<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://localhost/shopapp/info">
    		
    		
    
    
    
    			<xsd:complexType name="AllSiteList">
    				<xsd:all>
    					<xsd:element name="AllSiteListElements"	type="tns:AllSiteListElementArray" />
    				</xsd:all>
    			</xsd:complexType>
    			
    					
    			<xsd:complexType name="AllSiteListElementArray">
    				<xsd:complexContent>
    					<xsd:restriction base="soapenc:Array">
    						<xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="tns:AllSiteListElement[]" />
    					</xsd:restriction>
    				</xsd:complexContent>
    			</xsd:complexType>
    				
    			
    			<xsd:complexType name="AllSiteListElement">
    				<xsd:all>
    					<xsd:element name="idSite" type="tns:IDSite" />
    					<xsd:element name="name" type="xsd:string" minOccurs="1" maxOccurs="1"/>
    				</xsd:all>
    			</xsd:complexType>
    			
    
    
    
    
    
         <xsd:complexType name="IDSite">
           <xsd:attribute name="idSite" type="int" use="required"></xsd:attribute>
        </xsd:complexType>     
    
    	</wsdl:types>
    
    
    
    	
    
    
    	<wsdl:message name="getAllSitesResponse">
    		<wsdl:part name="getAllSitesResponse" type="tns:AllSiteList" />
    	</wsdl:message>
    
    	<wsdl:message name="getAllSitesRequest"></wsdl:message>
    
    	
    
        <wsdl:message name="Dummy"></wsdl:message>
        
        
        
    	
    
    
    	<wsdl:portType name="shopAPI">
    
    
    		<wsdl:operation name="getAllSites">
    			<wsdl:input message="tns:Dummy" />
    			<wsdl:output message="tns:getAllSitesResponse" />
    		</wsdl:operation>
    
    
    
    	</wsdl:portType>
    
    	
    
    
    	<wsdl:binding name="shopAPISOAP" type="tns:shopAPI">
    		<soap:binding style="rpc"
    			transport="http://schemas.xmlsoap.org/soap/http" />
    
    
    
    		<wsdl:operation name="getAllSites">
    			<soap:operation soapAction="shopAPI/getAllSites" />
    			<wsdl:output>
    				<soap:body
    					encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
    					namespace="shopAPI" parts=" getAllSitesResponse" use="encoded" />
    			</wsdl:output>
    		</wsdl:operation>
    		
    		
    	
    
    	</wsdl:binding>
    
    
    
    	
    
    
    
    	<wsdl:service name="shopAPI">
    		<wsdl:port binding="tns:shopAPISOAP" name="shopAPISOAP">
    			<soap:address
    				location="http://localhost/ws/server.php" />
    		</wsdl:port>
    	</wsdl:service>
    </wsdl:definitions>

    Wie hieraus zu erkennen ist habe ich eine Funktion (getAllSites).

    Ich benötige nun ja logischerweise eine PHP-Funktion, welche mir die Daten aus der Datenbank liest und entsprechend des Schemas der WSDL-Datei zurückgibt. Aus dieser Rückgabe und des WSDL-Schemas kann der Client - in meinem Falle JAVA - auf den Response-Code zugreifen und die entsprechenden Rückgaben verarbeiten.

    Mein Problem ist, das ich es nicht schaffe einen PHP-Code zu schreiben, der ungefähr dieses Response-XML ausgibt.


    Code:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
    <ns1:getAllSitesResponse>
    <return xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType=":AllSiteListElement[2]">
    <item xsi:type=":AllSiteListElement">
    <idShop xsi:type="xsd:int">79424</idShop>
    <name xsi:type="xsd:int">ShopA</name>
    </item>
    <item xsi:type=":AllSiteListElement">
    <idShop xsi:type="xsd:int">79428</idShop>
    <name xsi:type="xsd:int">ShopB</name>
    </item>
    </return>
    </ns1:getAllSitesResponse>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

    Die DB-Abfrage ist natürlich nicht das Problem. Es geht darum, PHP5 mit SoapVars und Schleifen und Arrays/Objekten zu bewegen, die korrekte XML-Response zu erzeugen.

    Wenn alles PHP-Intern ablaufen würde wäre alles kein Problem, da ich hier einfach ein Array zurückgeben und dieses im Client direkt weiterverarbeiten kann. Java hat sich da aber etwas eigensinniger.

    Leider ist dieses Thema IMHO absolut unterdokumentiert und man findet kaum etwas im Netz außer den obligatorischen Klassendefinitionen.

    Ich hoffe mir kann hier jemand weiterhelfen.

    Viele Grüße
    Micha

  • #2
    Stehe die wsdl Datei irgendwo vollständig zur Verfügung?

    Kommentar


    • #3
      Hallo,

      Zitat von Bruchpilot
      Stehe die wsdl Datei irgendwo vollständig zur Verfügung?
      Hab das Posting oben nochmal um die komplette WSDL-Datei ergänzt.

      Micha

      Kommentar


      • #4
        Da fehlt noch ein </xsd:schema>, damit es gültiges xml ist.
        Aber auch dann geht es durch keinen wsdl Validator, den ich gefunden habe, vollständig fehlerfrei/problemlos durch.
        php/soap liefert mit
        Code:
        <?php
        // $server = new SoapServer("test.wsdl.xml");
        $client = new SoapClient("test.wsdl");
        var_dump($client->__getTypes());
        var_dump($client->__getFunctions());
        ?>
        den Typ UNKNOWN, kommt also mit der Parameterdefinition nicht klar. Wer oder was hat diese Definition erstellt?


        Die Methode soll ein Feld mit Einträgen (id,name) zurückliefern?
        Dann versuch es mal mit.
        Code:
        <?xml version="1.0" encoding="utf-8"?>
        <wsdl:definitions
        	xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
        	xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
        	xmlns:s="http://www.w3.org/2001/XMLSchema"
        	xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
        	xmlns:tns="http://localhost/shopapp/info"
        	xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
        	targetNamespace="http://localhost/shopapp/info"
        	xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
          <wsdl:types>
            <s:schema elementFormDefault="qualified" targetNamespace="http://localhost/shopapp/info">
              <s:element name="getAllSites">
                <s:complexType />
              </s:element>
              <s:element name="getAllSitesResponse">
                <s:complexType>
                  <s:sequence>
                    <s:element minOccurs="0" maxOccurs="1" name="getAllSitesResult" type="tns:ArrayOfAllSiteListElement" />
                  </s:sequence>
                </s:complexType>
              </s:element>
              <s:complexType name="ArrayOfAllSiteListElement">
                <s:sequence>
                  <s:element minOccurs="0" maxOccurs="unbounded" name="AllSiteListElement" type="tns:AllSiteListElement" />
                </s:sequence>
              </s:complexType>
              <s:complexType name="AllSiteListElement">
                <s:sequence>
                  <s:element minOccurs="1" maxOccurs="1" name="idSite" type="s:int" />
                  <s:element minOccurs="0" maxOccurs="1" name="name" type="s:string" />
                </s:sequence>
              </s:complexType>
            </s:schema>
          </wsdl:types>
          <wsdl:message name="getAllSitesSoapIn">
        	<wsdl:part name="parameters" element="tns:getAllSites" />
          </wsdl:message>
          <wsdl:message name="getAllSitesSoapOut">
            <wsdl:part name="parameters" element="tns:getAllSitesResponse" />
          </wsdl:message>
          <wsdl:portType name="Service1Soap">
            <wsdl:operation name="getAllSites">
              <wsdl:input message="tns:getAllSitesSoapIn" />
              <wsdl:output message="tns:getAllSitesSoapOut" />
            </wsdl:operation>
          </wsdl:portType>
          <wsdl:binding name="Service1Soap" type="tns:Service1Soap">
            <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
            <wsdl:operation name="getAllSites">
              <soap:operation soapAction="http://localhost/shopapp/infogetAllSites" style="document" />
              <wsdl:input>
                <soap:body use="literal" />
              </wsdl:input>
              <wsdl:output>
                <soap:body use="literal" />
              </wsdl:output>
            </wsdl:operation>
          </wsdl:binding>
          <wsdl:service name="Service1">
            <documentation xmlns="http://schemas.xmlsoap.org/wsdl/" />
            <wsdl:port name="Service1Soap" binding="tns:Service1Soap">
              <soap:address location="http://localhost/ws/server.php" />
            </wsdl:port>
          </wsdl:service>
        </wsdl:definitions>

        Kommentar


        • #5
          Hi Bruchpilot,

          danke für Deine Antwort. Zur WSDL. Das schliessende Schema-Element ist mir beim Kopieren wohl durchgerutscht. Wollte nicht die ellenlange Datei posten sonder nur eine exemplarische Funktion. Die Datei scheint so aber zu funktionieren. Zumindest beim PHP und auch bei JAVA Axis wird sie ohne Fehler geparsed. Habe auch Deine Datei probiert. Meine PHP-Server-Funktion gibt mir hier ebenfalls ein Ergebnis zurück. Wenn dies auch etwas anders als das, was über meine WSDL-Datei ausgegeben wird.

          Das Problem ist aber eigentlich nicht die WSDL-Datei, sondern die Funktion die die SOAP-XML-Response erzeugt.

          Ich habe jetzt einen Weg gefunden um die Response entsprechend der Schema-Definition zu erzeugen. Man muss Klassen und die entspr. Objekte erzeugen und diese dann entsprechend der WSDL-Struktur ineinander verschachteln. Die einzelnen Objekte werden dann zusätlich in SoapVars gepackt und mit deren Hilfe die XML-Elemente modifiziert.

          Hier die WSDL-Type Definition für meine Beispielfunktion:

          Code:
          			<xsd:complexType name="AllSiteList">
          				<xsd:all>
          					<xsd:element name="AllSiteListElements"	type="tns:AllSiteListElementArray" />
          				</xsd:all>
          			</xsd:complexType>
          			
          					
          			<xsd:complexType name="AllSiteListElementArray">
          				<xsd:complexContent>
          					<xsd:restriction base="soapenc:Array">
          						<xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="tns:AllSiteListElement[]" />
          					</xsd:restriction>
          				</xsd:complexContent>
          			</xsd:complexType>
          				
          			
          			<xsd:complexType name="AllSiteListElement">
          				<xsd:all>
          					<xsd:element name="idSite" type="tns:idSite" />
          					<xsd:element name="name" type="xsd:string" minOccurs="1" maxOccurs="1"/>
          				</xsd:all>
          			</xsd:complexType>
          			
          
          
          		     <xsd:complexType name="idSite">
          		       <xsd:attribute name="oid" type="int" use="required"></xsd:attribute>
          		    </xsd:complexType>
          Hier die php Funktion die die WSDL-Konforme Response zurückgibt:

          Code:
          <?php
          
           class AllSiteListElement {
               public $name;
               public $idSite;
           }
          
          class AllSiteList{
          	public $AllSiteListElements;
          }
          
          class idSite{
          	public $oid;
          }
          
          
          ##################################################################################
          function getAllSites() {
          ##################################################################################		
          				
          		$sql = "SELECT idSite, name FROM site ORDER BY idSite";
          		$result_db = get_mysql_result($sql);
          		if (!$result_db) {
          			return new SoapFault('SERVER', mysql_error(), 'getAllShopSites', '');
          		}
          		
          		if(mysql_num_rows($result_db) == 0) {
          			return new SoapFault('Client', 'empty resultset', 'getAllSites', '');
          		} 
          		else {
          
          		    $AllSiteList = new AllSiteList();
          		    
          		    while($row = mysql_fetch_assoc($result_db)){
          					
          				$element = new AllSiteListElement(); 
          				$OidSite = new idSite();
          				
          				$OidSite->oid = new SoapVar($row[idSite], XSD_INT, '','','idSite');
          				
          				$element->idSite = new SoapVar($OidSite, SOAP_ENC_OBJECT, 'oid','','idSite');
          				$element->name = new SoapVar($row[name], XSD_STRING, '','','name');
          				
          				$AllSiteList->AllSiteListElements[] = new SoapVar($element, SOAP_ENC_OBJECT, 'AllSiteListElement','','AllSiteListElement');
          				
          	
          		   	}
          	    	mysql_close();
          		  	
          	    	return new SoapVar($AllSiteList, SOAP_ENC_OBJECT,'AllSiteList');
          	    	
          		}
          	}

          Das erzeugte Response-XML ist zumindest von php5 sowie Java (Apache Axis) verwertbar.

          Ich hoffe das hilft vielleicht dem Einen oder Anderen weiter und erspart einiges an Kopfzerbrechen und Rätselraten.

          Viele Grüße
          Micha

          Kommentar


          • #6
            Ja, und wenn Du das mapping explizit angibst, meckert php sogar, wenn es ein bestimmtes property nicht gibt.
            PHP-Code:
            <?php
            error_reporting
            (E_ALL);
            ini_set('display_errors', true);
            ini_set('soap.wsdl_cache_enabled', false);
            ini_set('soap.wsdl_cache_dir', 'd:/');
            ini_set('soap.wsdl_cache_ttl', 0);

            class 
            AllSiteListElement {
                public 
            $idSite,$name;
              
              public function 
            __construct($id, $name) {
                  
            $this->idSite = $id;
                  
            $this->name = $name;
              }
            }

            class 
            ArrayOfAllSiteListElement {
                public 
            $AllSiteListElement = array();
            }

            class 
            getAllSitesResponse {
                public 
            $getAllSitesResult;
                
                public function 
            __construct() {
                    
            $this->getAllSitesResult = new ArrayOfAllSiteListElement;
                }
            }

            function 
            getAllSites() {
                
            $response = new getAllSitesResponse();

                
            $response->getAllSitesResult->AllSiteListElement[] = new AllSiteListElement(1, 'siteA');
                
            $response->getAllSitesResult->AllSiteListElement[] = new AllSiteListElement(2, 'siteB');
                
                return 
            $response;
            }

            $request = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>
                <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://localhost/shopapp/info" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
                <SOAP-ENV:Body><tns:getAllSites xmlns:tns="http://localhost/shopapp/info"></tns:getAllSites></SOAP-ENV:Body></SOAP-ENV:Envelope>'
            ;
            $server = new SoapServer('test.wsdl',
                array(
                    
            'classmap'=>array(
                        
            'getAllSitesResponse'=>'getAllSitesResponse',
                        
            'ArrayOfAllSiteListElement'=>'ArrayOfAllSiteListElement',
                        
            'AllSiteListElement'=>'AllSiteListElement'
                    
            )
                )
            );
            $server->addFunction('getAllSites');
            $server->handle($request);
            ?>

            Kommentar


            • #7
              Hallo zusammen,

              endlich habe ich mal was gefunden zu dem Thema und habe mich auch gleich rangesetzt und versucht das für mich umzusetzen. Im Prinzip stellt sich genau dasselbe Problem: Wie kann ich von meinem Soap-Server (siehe unten) unter Nutzung meiner wsdl-Datei (siehe unten) die Daten korrekt formatiert an den Clienten zurückschicken, so wie es das Schema in der wsdl-Datei verlangt. Irgendwie klappt es noch nicht.

              wsdl-Datei:
              • <?xml version="1.0" encoding="utf-8" ?>
                <definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="http://www.bennedik.com/webservices/XfccBasic" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="http://www.bennedik.com/webservices/XfccBasic" xmlns="http://schemas.xmlsoap.org/wsdl/">

                <types>
                <s:schema elementFormDefault="qualified" targetNamespace="http://www.bennedik.com/webservices/XfccBasic">

                <s:element name="GetMyGames">
                <s:complexType>
                <s:sequence>
                <s:element minOccurs="0" maxOccurs="1" name="username" type="s:string" />
                <s:element minOccurs="0" maxOccurs="1" name="password" type="s:string" />
                </s:sequence>
                </s:complexType>
                </s:element>

                <s:element name="GetMyGamesResponse">
                <s:complexType>
                <s:sequence>
                <s:element minOccurs="0" maxOccurs="1" name="GetMyGamesResult" type="s0:ArrayOfXfccGame" />
                </s:sequence>
                </s:complexType>
                </s:element>

                <s:complexType name="ArrayOfXfccGame">
                <s:sequence>
                <s:element minOccurs="0" maxOccurs="unbounded" name="XfccGame" nillable="true" type="s0:XfccGame" />
                </s:sequence>
                </s:complexType>

                <s:complexType name="XfccGame">
                <s:sequence>
                <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
                <s:element minOccurs="0" maxOccurs="1" name="white" type="s:string" />
                <s:element minOccurs="0" maxOccurs="1" name="black" type="s:string" />
                <s:element minOccurs="0" maxOccurs="1" name="event" type="s:string" />
                <s:element minOccurs="0" maxOccurs="1" name="site" type="s:string" />
                <s:element minOccurs="1" maxOccurs="1" name="myTurn" type="s:boolean" />
                <s:element minOccurs="1" maxOccurs="1" name="hasWhite" type="s:boolean" />
                <s:element minOccurs="0" maxOccurs="1" name="moves" type="s:string" />
                <s:element minOccurs="1" maxOccurs="1" name="drawOffered" type="s:boolean" />
                <s:element minOccurs="0" maxOccurs="1" name="message" type="s:string" />
                <s:element minOccurs="0" maxOccurs="1" name="serverInfo" type="s:string" />
                <s:element minOccurs="0" maxOccurs="1" name="whiteTitle" type="s:string" />
                <s:element minOccurs="0" maxOccurs="1" name="blackTitle" type="s:string" />
                <s:element minOccurs="1" maxOccurs="1" name="whiteElo" type="s:int" />
                <s:element minOccurs="1" maxOccurs="1" name="blackElo" type="s:int" />
                <s:element minOccurs="0" maxOccurs="1" name="whiteNA" type="s:string" />
                <s:element minOccurs="0" maxOccurs="1" name="blackNA" type="s:string" />
                <s:element minOccurs="0" maxOccurs="1" name="eventSponsor" type="s:string" />
                <s:element minOccurs="0" maxOccurs="1" name="section" type="s:string" />
                <s:element minOccurs="0" maxOccurs="1" name="stage" type="s:string" />
                <s:element minOccurs="0" maxOccurs="1" name="board" type="s:string" />
                <s:element minOccurs="0" maxOccurs="1" name="timeControl" type="s:string" />
                <s:element minOccurs="0" maxOccurs="1" name="setup" type="s:string" />
                <s:element minOccurs="0" maxOccurs="1" name="fen" type="s:string" />
                <s:element minOccurs="1" maxOccurs="1" name="result" type="s0:Result" />
                <s:element minOccurs="1" maxOccurs="1" name="daysPlayer" type="s:int" />
                <s:element minOccurs="1" maxOccurs="1" name="hoursPlayer" type="s:int" />
                <s:element minOccurs="1" maxOccurs="1" name="minutesPlayer" type="s:int" />
                <s:element minOccurs="1" maxOccurs="1" name="daysOpponent" type="s:int" />
                <s:element minOccurs="1" maxOccurs="1" name="hoursOpponent" type="s:int" />
                <s:element minOccurs="1" maxOccurs="1" name="minutesOpponent" type="s:int" />
                <s:element minOccurs="0" maxOccurs="1" name="gameLink" type="s:string" />
                <s:element minOccurs="0" maxOccurs="1" name="eventDate" type="s:string" />
                </s:sequence>
                </s:complexType>

                <s:simpleType name="Result">
                <s:restriction base="s:string">
                <s:enumeration value="Ongoing" />
                <s:enumeration value="WhiteWins" />
                <s:enumeration value="BlackWins" />
                <s:enumeration value="Draw" />
                <s:enumeration value="WhiteWinAdjudicated" />
                <s:enumeration value="BlackWinAdjudicated" />
                <s:enumeration value="DrawAdjudicated" />
                <s:enumeration value="WhiteDefaulted" />
                <s:enumeration value="BlackDefaulted" />
                <s:enumeration value="BothDefaulted" />
                <s:enumeration value="Cancelled" />
                <s:enumeration value="AdjudicationPending" />
                </s:restriction>
                </s:simpleType>

                <s:element name="MakeAMove">
                <s:complexType>
                <s:sequence>
                <s:element minOccurs="0" maxOccurs="1" name="username" type="s:string" />
                <s:element minOccurs="0" maxOccurs="1" name="password" type="s:string" />
                <s:element minOccurs="1" maxOccurs="1" name="gameId" type="s:int" />
                <s:element minOccurs="1" maxOccurs="1" name="resign" type="s:boolean" />
                <s:element minOccurs="1" maxOccurs="1" name="acceptDraw" type="s:boolean" />
                <s:element minOccurs="1" maxOccurs="1" name="movecount" type="s:int" />
                <s:element minOccurs="0" maxOccurs="1" name="myMove" type="s:string" />
                <s:element minOccurs="1" maxOccurs="1" name="offerDraw" type="s:boolean" />
                <s:element minOccurs="1" maxOccurs="1" name="claimDraw" type="s:boolean" />
                <s:element minOccurs="0" maxOccurs="1" name="myMessage" type="s:string" />
                </s:sequence>
                </s:complexType>
                </s:element>

                <s:element name="MakeAMoveResponse">
                <s:complexType>
                <s:sequence>
                <s:element minOccurs="1" maxOccurs="1" name="MakeAMoveResult" type="s0:MakeAMoveResult" />
                </s:sequence>
                </s:complexType>
                </s:element>

                <s:simpleType name="MakeAMoveResult">
                <s:restriction base="s:string">
                <s:enumeration value="Success" />
                <s:enumeration value="ServerError" />
                <s:enumeration value="AuthenticationFailed" />
                <s:enumeration value="InvalidGameID" />
                <s:enumeration value="NotYourGame" />
                <s:enumeration value="NotYourTurn" />
                <s:enumeration value="InvalidMoveNumber" />
                <s:enumeration value="InvalidMove" />
                <s:enumeration value="NoDrawWasOffered" />
                <s:enumeration value="LostOnTime" />
                <s:enumeration value="YouAreOnLeave" />
                <s:enumeration value="MoveIsAmbigous" />
                </s:restriction>
                </s:simpleType>

                </s:schema>
                </types>

                <message name="GetMyGamesSoapIn">
                <part name="parameters" element="s0:GetMyGames" />
                </message>

                <message name="GetMyGamesSoapOut">
                <part name="parameters" element="s0:GetMyGamesResponse" />
                </message>

                <message name="MakeAMoveSoapIn">
                <part name="parameters" element="s0:MakeAMove" />
                </message>

                <message name="MakeAMoveSoapOut">
                <part name="parameters" element="s0:MakeAMoveResponse" />
                </message>

                <message name="MakeAMove2SoapIn">
                <part name="parameters" element="s0:MakeAMove2" />
                </message>

                <message name="MakeAMove2SoapOut">
                <part name="parameters" element="s0:MakeAMove2Response" />
                </message>

                <portType name="XfccBasicSoap">
                <operation name="GetMyGames">
                <input message="s0:GetMyGamesSoapIn" />
                <output message="s0:GetMyGamesSoapOut" />
                </operation>
                <operation name="MakeAMove">
                <input message="s0:MakeAMoveSoapIn" />
                <output message="s0:MakeAMoveSoapOut" />
                </operation>
                </portType>

                <binding name="XfccBasicSoap" type="s0:XfccBasicSoap">
                <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />

                <operation name="GetMyGames">
                <soapperation soapAction="http://www.bennedik.com/webservices/XfccBasic/GetMyGames" style="document" />
                <input>
                <soap:body use="literal" />
                </input>
                <output>
                <soap:body use="literal" />
                </output>
                </operation>

                <operation name="MakeAMove">
                <soapperation soapAction="http://www.bennedik.com/webservices/XfccBasic/MakeAMove" style="document" />
                <input>
                <soap:body use="literal" />
                </input>
                <output>
                <soap:body use="literal" />
                </output>
                </operation>
                </binding>

                <service name="XfccBasic">
                <port name="XfccBasicSoap" binding="s0:XfccBasicSoap">
                <soap:address location="http://127.0.0.1/xfcc/XFCCbasic.php" />
                </port>
                </service>
                </definitions>


              PHP5-Soap-Server-Skript:
              PHP-Code:
              <?
              class ArrayOfXfccGame {
                  public $id;
                  public $white;
                  public $black;
                  public $event;
                  public $site;
                  public $myTurn;
                  public $hasWhite;
                  public $moves;
                  public $drawOffered;
                  }

              class AllGamesList{
                  public $ArrayOfXfccGames;
                  }

              class id{
                  public $oid;
                  }

              ##################################################################################
              function GetMyGames($data) {
              ##################################################################################      
                  $username = $data->username;
                  $password = $data->password;

                  require('config.inc.php4');
                          
                  $sql = "SELECT * FROM tabelle WHERE username = '$username' AND password = '$password' ORDER BY id ASC";
                  $result_db = mysql_query($sql, $conn);
                  if (!$result_db) {
                      return new SoapFault('SERVER', mysql_error(), 'GetMyGames', '');
                      }

                  if(mysql_num_rows($result_db) == 0) {
                      return new SoapFault('Client', 'empty resultset', 'GetMyGames', '');
                      }

                  else     {
                      $AllGamesList = new AllGamesList();

                      while($partiedaten = mysql_fetch_array($result_db, MYSQL_ASSOC)) {
                          $daten = array_values($partiedaten);
                          
                          $element = new ArrayOfXfccGame();
                          $OidGame = new id();
                          $OidGame->oid = new SoapVar($daten[0], XSD_INT, '','','id');
                          
                          $element->id = new SoapVar($OidGame, SOAP_ENC_OBJECT, 'oid','','id');
                          $element->white= new SoapVar($daten[1], XSD_STRING, '','','white');
                          $element->black= new SoapVar($daten[2], XSD_STRING, '','','black');
                          $element->event= new SoapVar($daten[3], XSD_STRING, '','','event');
                          $element->site= new SoapVar($daten[4], XSD_STRING, '','','site');
                          $element->myTurn= new SoapVar($daten[5], XSD_STRING, '','','myTurn');
                          $element->hasWhite= new SoapVar($daten[6], XSD_STRING, '','','hasWhite');
                          $element->moves= new SoapVar($daten[7], XSD_STRING, '','','moves');
                          $element->drawOffered= new SoapVar($daten[8], XSD_STRING, '','','drawOffered');

                          $AllGamesList->ArrayOfXfccGames[] = new SoapVar($element, SOAP_ENC_OBJECT, 'AllGamesList','','AllGamesList');
                          
                          }
                      mysql_close();
                      return new SoapVar($AllGamesList, SOAP_ENC_OBJECT,'AllGamesList');
                      }
                  }


              try     {
                  $server = new SOAPServer('xfcc.wsdl');
                  $server->addFunction('GetMyGames');
                  $server->handle();
                  }

              catch (SOAPFault $f) {
                  print $f->faultstring;
                  }
              ?>
              Kann mir jemand weiterhelfen?
              Vielen Dank schon mal!
              Matthias

              Kommentar


              • #8
                Erfolgsmeldung!

                Habs! Läuft!

                Kommentar

                Lädt...
                X