2012-11-07 11 views
5

Attualmente sto lavorando a un servizio di soap interno per controllare alcuni processi interni. Che normalmente non è poi così difficile. Sto comunque cercando di utilizzare la funzionalità classmap soapClient per mappare gli oggetti invece di lavorare con le stdClasses che vengono normalmente restituite per tipi non complessi.l'opzione classmap non funziona mentre si utilizza php's SoapClient

Considerando il fatto che wsdl e le fonti occupano molto spazio in termini di spazio, collegherò a documenti pertinenti invece di inviarli in questa domanda.

Prima di tutto sto utilizzando Zend_Soap_Server e Zend_Soap_Server_Autodiscover per il mio servizio Soap e generazione wsdl. codice del server

Sapone: risultato https://www.dropbox.com/s/eji7l50g42m2ixl/SoapServer.txt

WSDL per la richiesta wsdl:? https://www.dropbox.com/s/vyxbjz7wogd8suy/wsdl.txt

Il servizio sapone pubblica un ServiceClass. Questa classe contiene un metodo per ottenere dati dal nostro servizio di sapone. Questo metodo è chiamato getPackages.

metodo getPackages formano il servizio sapone: https://www.dropbox.com/s/p5ddxpraju7ru6x/method_from_serviceclass.txt

Procedimento getPackages restituisce un DataObject che a sua volta contiene ritorni riferimenti ad altri oggetti dati. Questi oggetti esistono su entrambi i server come client e sono esattamente gli stessi su entrambe le estremità.

L'oggetto dati principali: https://www.dropbox.com/s/qt51pw3rpq7c2ba/dataobject.txt

Quando si collega a questo servizio e chiamando il metodo getPackages, ottengo la risposta come previsto: una stdClass contenente un VPS e un terreno comune.

Unfortionatly quando si aggiunge la mappa di classe, il risultato rimane esattamente lo stesso .. un stdClass contenente vps e una proprietà condivisa. Il risultato previsto sarebbe un oggetto Soho_Soap_DataObject_Packages contenente le proprietà vps e condivise.

Questo è il codice SoapClient utilizzato: https://www.dropbox.com/s/ulnni84p8dawv97/SoapClient.txt

Quando chiamo il metodo getPackages attraverso Sapone ottengo il seguente:

$SoapClient = \Soho_Soap_Client::getInstance(); 
$packages = $SoapClient->getPackages(); 
print_r($packages); 

uscita:

stdClass Object 
(
[shared] => Array 
    (
     [0] => stdClass Object 
      (
       [id] => 
       [title] => 
       [pricePerPeriod] => 
       [price] => 
       [minRegistrationMonths] => 
       [properties] => 
       [options] => Array 
        (
        ) 
      ) 
    ) 
[vps] => 

)

Tuttavia, se guardo il respo Tipi di NSE ottengo il seguente:

print_r($SoapClient->__getTypes()); 

uscita:

Array 
    (
    [0] => Soho_Soap_DataObject_Package_Shared ArrayOfSoho_Soap_DataObject_Package_Shared[] 
    [1] => struct stdClass { 

    } 
    [2] => Soho_Soap_DataObject_Package_Shared_Option ArrayOfSoho_Soap_DataObject_Package_Shared_Option[] 
    [3] => struct Soho_Soap_DataObject_Package_Shared_Option { 
     string title; 
     string value; 
    } 
    [4] => struct Soho_Soap_DataObject_Package_Shared { 
     int id; 
     string title; 
     int pricePerPeriod; 
     int price; 
     int minRegistrationMonths; 
     stdClass properties; 
     ArrayOfSoho_Soap_DataObject_Package_Shared_Option options; 
    } 
    [5] => Soho_Soap_DataObject_Package_Vps ArrayOfSoho_Soap_DataObject_Package_Vps[] 
    [6] => Soho_Soap_DataObject_Package_Vps_Option ArrayOfSoho_Soap_DataObject_Package_Vps_Option[] 
    [7] => struct Soho_Soap_DataObject_Package_Vps_Option { 
     string title; 
     string value; 
    } 
    [8] => struct Soho_Soap_DataObject_Package_Vps { 
     int id; 
     string title; 
     int pricePerPeriod; 
     int price; 
     int minRegistrationMonths; 
     stdClass properties; 
     ArrayOfSoho_Soap_DataObject_Package_Vps_Option options; 
    } 
    [9] => struct Soho_Soap_DataObject_Packages { 
     ArrayOfSoho_Soap_DataObject_Package_Shared shared; 
     ArrayOfSoho_Soap_DataObject_Package_Vps vps; 
    } 
    )   

Google non mi sta aiutando molto dal documentiation classmapping non è tutto troppo grande per cominciare, quindi spero che la comunità pila può illuminare il mio problema.

2 giorni di fissare lo stesso problema mi rende disperata.

Poco tempo fa ho usato SoapClient allo stesso modo per comunicare con una API vmware vsphere che ha funzionato perfettamente, quindi penso che il problema abbia qualcosa a che fare con il WDSL, ma attualmente sono perso.

Ringrazio tutti coloro che si prendono il tempo di guardare il mio problema in anticipo per il loro tempo. Naturalmente fornirò informazioni aggiuntive quando richiesto.

risposta

9

Una cosa salta fuori quando guardando il codice, e cioè che l'istanza zend_soap_server dovrebbe usare di essa la propria WSDL, in questo modo:

$SoapServer = new Zend_Soap_Server($urltowsdl, array('classmap' => $classmap)); 
+0

Accidenti Johannes, ora so perché mi manchi :) Si totalmente azzeccato. Modificato in codice su $ SoapServer = nuovo Zend_Soap_Server ( 'https: // [[URL]]/SoapService /'. SOAP_VERSION. '/'. $ Service. '? Wsdl', array ('classmap' => Soho_Soap_ClassMap :: soapMap()) ); che completamente risolto :) Dovrà comprarti presto una birra. –

+0

Divertente come nessuno ha mai capito la domanda e poi un ex-collega lo inchioda sulla testa :) –

+0

@DamienOvereem: Non abbiamo molti utenti SOAP qui, quindi a queste domande normalmente non viene data risposta entro 15 minuti;) Anche la tua domanda è abbastanza grande Sto solo dicendo – hakre

Problemi correlati