Attribute in einem Soap Request

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

  • Attribute in einem Soap Request

    Guten Morgen,

    ich sitze momentan vor einem kleinen Problem mit der Validierung eines Soap Requests. Es wird ein SoapClient anhand einer WSDL erstellt und es soll eine Funktion des Webservices ausgeführt werden.

    Für den Aufruf der Webservice Funktion übergebe ich ein Objekt mit allen erforderlichen Parametern. Macht ja soweit auch Sinn.

    Kurzes praktisches Beispiel:
    PHP-Code:
    $client = new SoapClient($wsdl, array(
        
    'trace' => 1,
        
    'exceptions' => true,
        
    'cache_wsdl' => WSDL_CACHE_NONE
    ));

    class 
    StructStatus {
        public 
    $ProzessID 0;

        public function 
    __construct($ProzessID) {
            
    $this->ProzessID $ProzessID;
        }
    }

    class 
    StructRequest {
        public 
    $Request null;

        public function 
    __construct($ProzessID) {
            
    $this->Request = new stdClass();
            
    $this->Request->Status = new StructStatus($ProzessID);
        }
    }

    $params = new StructRequest(123);
    $client->getStatus($params); 
    Daraus erhalte ich dann folgendes XML:
    Code:
    <ns1:getStatus>
        <ns1:Request>
            <ns1:Status>
                <ns1:ProzessID>26831</ns1:ProzessID>
            </ns1:Status>
        </ns1:Request>
    </ns1:getStatus>
    Nun wird aber ein SoapFault geworfen, weil der Request Knoten noch ein Attribut "Version" benötigt. Ohne dieses ist das Schema nämlich invalid. Es soll also so aussehen:
    Code:
    <ns1:getStatus>
        <ns1:Request Version="1.0.0.1">
            ...
        </ns1:Request>
    </ns1:getStatus>
    Die Frage: Wie bekomme ich anhand der Klassenstruktur StructRequest und StructStatus das Attribut "Version" gesetzt? Gibt es hierfür eine Lösung?
    MM Newmedia | MeinBlog

  • #2
    Hmm - schau dir da mal die letzte Antwort an - vielleicht kommst du damit hin:
    [SOLVED] php Soap Client - Node Attributes
    Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
    Schön - etwas Geschichte kann ja nicht schaden.
    Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

    Kommentar


    • #3
      Ein riesengroßes Dankeschön an Quetschi, der hier den richtigen Denkanstoss gegeben hat. Zur Komplettierung des Themas auch noch die Lösung für die Nachwelt, basierend auf dem obigen Beispiel.

      PHP-Code:
      /* Datenobjekt anhand der beschreibenden WSDL Datei */
      class StructStatus {
          public 
      $ProzessID 0;

          public function 
      __construct($ProzessID) {
              
      $this->ProzessID $ProzessID;
          }
      }

      class 
      StructRequest {
          public 
      $Version '1.0.0.1';
          public 
      $Status null;

          public function 
      __construct($ProzessID) {
              
      $this->Status = new StructStatus($ProzessID);
          }



      /* SoapClient Objekt erstellen */
      $client = new SoapClient($wsdl, array(
          
      'trace' => 1,
          
      'exceptions' => true,
          
      'cache_wsdl' => WSDL_CACHE_NONE,
          
      'classmap' => array('Request' => 'StructRequest')
      ));

      $params = new StructRequest(123);
      $encodedParams = new SoapVar($paramsSOAP_ENC_OBJECT"CT_StatusRequest"'http://www.bipro.net/namespace');
      $result $client->__soapCall('getStatus', array('parameters' => array('Request' => $encodedParams))); 
      Das daraus resultierende XML Schema sieht dann wie folgt aus:
      Code:
      <ns1:getStatus>
          <ns1:Request Version="1.0.0.1">
              ...
          </ns1:Request>
      </ns1:getStatus>
      Die Lösung liegt im SoapVar Objekt. Beim Aufruf der Webservice Funktion getStatus werden mit dem Encoding SOAP_ENC_OBJECT übergeben. Darüber hinaus wird der Name des Datentyps übergeben und der Namespace, in dem der genannte Typ definiert wird.

      In der Klasse StructRequest wird das Attribut "Version" als Member definiert. Anhand des angegebenen Typs CT_StatusRequest weiß das SoapClient Objekt nun, dass das Klassenmember Version ein Attribut ist.

      An sich etwas umständlich, aber es funktioniert tadellos.

      Danke!
      Zuletzt geändert von ezkimo; 13.08.2012, 20:05.
      MM Newmedia | MeinBlog

      Kommentar


      • #4
        Ich hätt wahrscheinlich eher __doRequest() des SoapClient überschrieben und dort das Attribut schnell reingeklatscht

        Mach das z.B. um für WSS-UserNameToken gesicherte Webservices die entsprechenden Header nicht auf diese Art reinfummeln zu müssen.
        Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
        Schön - etwas Geschichte kann ja nicht schaden.
        Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

        Kommentar

        Lädt...
        X