Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] (Nu)SOAP Rückgabe als Array

Einklappen

Neue Werbung 2019

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

  • [Erledigt] (Nu)SOAP Rückgabe als Array

    Hallo zusammen,

    ich schlage mich gerade mit einem Webservice herum, der als Antwort eine Liste mit Daten zurückgeben soll.

    Neben der Liste soll alternativ auch noch eine Bestätigung bzw. eine Fehlerbeschreibung zuurückgegeben werden. Die Implementierung habe ich mit NuSOAP vorgenommen, aber evntl. ist das "Problem" auch einfacher und ich stehe einfach nur auf dem Schlauch.

    Der Server inkl. Beschreibung der Complex-Types für Ein- und Ausgabe
    PHP-Code:
        $server->wsdl->addComplexType('wsListPurchasesInputCT','complexType','struct','all','',
            array(
                
    'loginEmail' => array('name' => 'loginEmail','type' => 'xsd:string'), 
                
    'loginSessionID' => array('name' => 'loginSessionID','type' => 'xsd:int')
            ));         
        
    $server->wsdl->addComplexType('wsListPurchasesReturnCT','complexType','struct','all','',
            array(
                
    'listPurchasesError' => array('name' => 'listPurchasesError','type' => 'xsd:string'), 
                
    'listPurchases' => array('name' => 'listPurchases','type' => 'xsd:string'),        
                
    'listPurchasesConfirm' => array('name' => 'listPurchasesConfirm','type' => 'xsd:boolean')
            )); 
            
        
    $server->register(
            
    'wsListPurchases',
            array(
    'listPurchasesInputArray'=>'tns:wsListPurchasesInputCT'), //Eingabeparameter (s.o.)
            
    array('return'=>'tns:wsListPurchasesReturnCT'), //Rückgabe (s.o.)
            
    $namespacefalse'rpc''literal'
            
    '#8'); // Beschreibung 
    Die Methode (Demowerte)
    PHP-Code:
        function wsListPurchases($listPurchasesInputArray){
            
    $listPurchasesError "Fehlermeldung";
            
    $listPurchasesConfirm true;            
            
    $listPurchases = array(
                
    'wert1' => "text 1",
                
    'wert2' => "text 2",
                
    'wert3' => "text 3",
                
    'wert4' => "text 4",
                
    'wert5' => "text 5",
                
    'wert6' => "text 6",                
                
    'wert7' => "text 7");
            return 
    $returnArray = array('listPurchasesError' => $listPurchasesError'listPurchases' => $listPurchases'listPurchasesConfirm' => $listPurchasesConfirm);
        } 
    Der Client inkl. der kompletten Antwort und des Ausgebens des Arrays
    PHP-Code:
        $inputArray_08 = array('loginEmail' => "max@mustermann.de"'loginSessionID' => "12345");
        
    $response_08 $SOAPClient->wsListPurchases($inputArray_08);
        
    var_dump($response_08);
        
        
    $listPurchaseArray $response_08->listPurchases;
        
    var_dump($response_08->listPurchases); 
    Die Ausgaben des Clients:
    object(stdClass)#3 (3) {
    ["listPurchasesError"]=>
    string(13) "Fehlermeldung"
    ["listPurchases"]=>
    string(5) "Array"
    ["listPurchasesConfirm"]=>
    bool(true)
    }
    string(5) "Array"
    Wie man sehen kann, funktioniert der Service insofern, dass die Objekte zurückgegeben werden. Die Rückgabe "listPurchases" sollte jetzt die Array-Werte beinhalten. Aktuell habe ich diese Variable im ComplexType ja aber als xsd:string deklariert, daher vermute ich, dass dort sowas wie "xsd:array" o.ä. stehen müsste. Also entweder ist die Deklaration falsch oder ich mache einen anderen Fehler beim Auslesen. Übertragen wird ja ganz klar ein Array?!

    Alternativ kann ich mir aber auch gut vorstellen, die Daten vor der Rückgabe in ein XML-Format zu pressen und dann als String zurückzugeben. Ein erster Versuch schlug allerdings fehl, da sämtliche Spitzen-Klammern des XMLs geparst wurden. Wie ist es üblich ein XML per SOAP zu versenden? Codiere ich das XML in base64 oder packe es in irgendeine eine Hülle?

    Wäre toll, wenn mir jemand einen Tipp dazu geben könnte - Vielen Dank!

  • #2
    Jep, dein Typ ist falsch. Muss als Array deklariert werden. Je nachdem was im Array ist halt als Array eines der nativen Typen oder eines neuen komplexen Typen.

    Kommentar


    • #3
      Zitat von mquadrat Beitrag anzeigen
      Jep, dein Typ ist falsch. Muss als Array deklariert werden. Je nachdem was im Array ist halt als Array eines der nativen Typen oder eines neuen komplexen Typen.
      Danke. Parallel hatte ich auch die selbe Eingebung.

      Dioe Lösung ist dann einfach eine weitere Verschachtelung und sieht dann wie folgt aus:

      Deklarierung des Typs
      PHP-Code:
      'listPurchases' => array('name' => 'listPurchases','type' => 'tns:assetDetails'), 
      Detaildeklarierung des Arrays
      PHP-Code:
          $server->wsdl->addComplexType('assetDetails''complexType''struct''all''',
              array(
                      
      'wert1' => array('name' => 'wert1','type' => 'xsd:string'),
                      
      'wert2' => array('name' => 'wert2','type' => 'xsd:string'),
                      
      'wert3' => array('name' => 'wert3','type' => 'xsd:string'),
                      
      'wert4' => array('name' => 'wert4','type' => 'xsd:string'),
                      
      'wert5' => array('name' => 'wert5','type' => 'xsd:string'),
                      
      'wert6' => array('name' => 'wert6','type' => 'xsd:string'),
                      
      'wert7' => array('name' => 'wert7','type' => 'xsd:string'),)
              ); 

      Kommentar


      • #4
        kT.

        Kommentar

        Lädt...
        X