SOAP mit XML Request. Parameter-Datentyp wird total ignoriert.

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

  • SOAP mit XML Request. Parameter-Datentyp wird total ignoriert.

    Hallo zusammen,

    ich habe eine kurze Frage:

    Ich baue gerade ein winziges PHP-Script mit einem Soap-Server & -Client. Der Server hat die Funktion "delete", "edit" und "insert".

    Alle 3 Funktionen haben EINEN Parameter von einem Datentyp, den ich in der WSDL-Datei selber definiere. Dies ist ein complexType, der angibt, wie ein XML Request, der an den Server gesendet wird, auszusehen hat. Sieht der XML-Baum NICHT so aus, wie von mir per complexType im WSDL definiert, so soll ein Fehler geworfen werden.

    Um mal ein anderes (einfacheres) Beispiel zu zeigen:

    Kurz: Der Server soll eine einfache Rechenaufgabe ausführen. Dabei werden 2 Parameter von der Funktion erwartet. Die beiden Parameter müssen laut WSDL-Datei jeweils INTEGER sein.
    Jedoch ist es auch hier VÖLLIG egal, welche Datentypen ich als Parameter übergebe.

    Server.php
    PHP-Code:
    <?php
    require_once('math.php');

    $server = new SoapServer("math.wsdl");
    $server->setClass('mathfunctions');
    $server->addFunction("add");
    $server->handle();
    ?>
    Client.php
    PHP-Code:
    <?php

    class client {
        
        protected 
    $client;
        
        function 
    __construct() {
            
    $this->client = new SoapClient("http://localhost/www/webservice/server.php?wsdl");
        }
        
        function 
    add() {
            return 
    $this->client->__soapCall('add', array(10,2));
        }

    }
        
    try {
        
    $client = new SoapClient("http://localhost/www/webservice/Server.php?wsdl");
        echo 
    $client->add(100,7) . '<hr>';
    } catch(
    SoapFault $e) {
        echo 
    '<pre>';print_r($e);echo '</pre>';
    }
    ?>
    Math.wsdl
    Code:
    <?xml version ='1.0' encoding ='UTF-8' ?>
    <definitions name='Math'
      targetNamespace='http://localhost/www/webservice/Math'
      xmlns:tns='http://localhost/www/webservice/Math'
      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/'> 
    
    	<message name='addRequest'>
    	  <part name='a' type='xsd:int'/>
    	  <part name='b' type='xsd:int'/>
    	</message>
    	<message name='addResponse'>
    	  <part name='Result' type='xsd:int'/>
    	</message>
    	
    	<portType name='addPortType'>
    	  <operation name='add'>
    		<input message='tns:addRequest'/>
    		<output message='tns:addResponse'/>
    	  </operation>
    	</portType>
    	
    	<binding name='addBinding' type='tns:addPortType'>
    	  <soap:binding style='rpc'
    		transport='http://schemas.xmlsoap.org/soap/http'/>
    		  <operation name='add'>
    			<soap:operation soapAction='urn:Math#add'/>
    			<input>
    			  <soap:body use='encoded' namespace='urn:Math'
    				encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
    			</input>
    			<output>
    			  <soap:body use='encoded' namespace='urn:Math'
    				encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
    			</output>
    		  </operation>
    	</binding>
    
    	<service name='addService'>
    	  <port name='addPort' binding='tns:addBinding'>
    		<soap:address location='http://localhost/www/webservice/server.php'/>
    	  </port>
    	</service>
    </definitions>
    Kann mir einer einen Tipp geben, was ich falsch mache?

  • #2
    Wie sieht denn Dein Request aus? Wie sieht die Response aus? Lass Dir diese beiden Werte doch mal ausgeben. Eventuell siehst Du hier schon Dein Problem.
    MM Newmedia | MeinBlog

    Kommentar


    • #3
      Wenn der Server einen Integer erwartet, dann konvertiert PHP automatisch.

      Was sagen denn die Klinetfunktionen __getFunctions() und __getTypes()?

      PHP-Code:
          function add() { 
              return 
      $this->client->__soapCall('add', array(10,2)); 
      Diese Methode ist überflüssig.

      Ein add() Methodenaufruf sollte automatisch einen __soapCall auslösen.
      (sofern dieser in der WSDL korrekt deklariert ist)

      Siehe: Soap Client - PHP Forum: phpforum.de

      PS:
      Als Serversoftware würde ich den Zend Soap Server nutzen, denn er kann die WSDL automatisch generieren.
      Zuletzt geändert von combie; 21.12.2012, 10:37.
      Wir werden alle sterben

      Kommentar

      Lädt...
      X