2009-09-22 13 views
8

Desidero restituire una matrice di oggetti dell'articolo in un servizio Web PHP, utilizzando nuSOAP v 1.114. Questo è il modo ho creato il WSDL:Restituzione di una matrice di oggetti nel servizio Web PHP

$server->wsdl->addComplexType(
'ArticleType', 
'complexType', 
'struct', 
'all', 
'', 
array('articleId' => array('name'=>'articleId', 'type'=>'xsd:int'), 
     'heading' => array('name'=>'heading', 'type'=>'xsd:string'), 
     'text' => array('name'=>'text', 'type'=>'xsd:string') 
    ) 
); 


$server->wsdl->addComplexType(
'ArrayOfArticleType', 
'complexType', 
'array', 
'', 
'SOAP-ENC:Array', 
array(), 
array(
    array('ref' => 'SOAP-ENC:arrayType', 
      'wsdl:arrayType' => 'tns:ArticleType[]'  // ArticleType[] 
     )    
    ), 
'tns:ArticleType' 
); 

La mia classe PHP articolo è molto semplice:

class Article { 
public $articleId; 
public $heading; 
public $text; 

public function __construct($articleId, $heading, $text=NULL) { 
    $this->articleId = $articleId; 
    $this->heading = $heading; 
    $this->text = $text; 
} 
} 

Se torno solo un nuovo articolo oggetto, in questo modo:

function TestArrayReturn() { 
    $arr = new Article(12345, "Test heading", "Test text."); 
    //$arr2 = array($arr); 
    return $arr; 
} 

la funzione, registrato come:

$server->register("TestArrayReturn", array(), array('return'=>'tns:ArticleType'), $namespace, $namespace."#TestArrayReturn", 'rpc', 'encoded', 'Test function'); 

funziona correttamente e restituisce l'articolo come se fosse una matrice. Tuttavia, se provo a restituire un oggetto ArrayOfArticleType (la riga commentata in TestArrayReturn()), e registro la funzione come tipo restituito tns: ArrayOfArticleType, quindi non riesce con Errore: Errore HTTP: nessun dato presente dopo le intestazioni HTTP.

Se, tuttavia, io creo un array di array manualmente, in questo modo:

$arr = array("articleId"=>12345, "heading"=>"Test heading", "text"=>"Test text"); 
$arr2 = array("articleId"=>12345, "heading"=>"Test heading", "text"=>"Test text"); 
return array($arr, $arr2); 

funziona !? Cosa c'è di sbagliato nella mia descrizione WSDL di ArrayOfArticleType che non gli permette di serializzare correttamente gli oggetti ArticleType, ma serializzare correttamente un array associativo con le stesse proprietà ("articleId", "heading", "text") ??

Ci scusiamo per tutto il codice, ma ritengo sia necessario individuare l'errore che sto trascurando. Qualsiasi aiuto è apprezzato, ho faticato con l'impostazione del WSDL per questo servizio per giorni.

risposta

4

Ho risolto questo errore. Per chiunque sia interessato, questo sembra essere un bug in NuSOAP. È necessario registrare il returnType per la funzione come xsd: Array perché restituisca correttamente l'array, anche se WSDL corretto lo costituirà come "tns: ArrayOfArticleType". Ho trovato questo in qualche codice sorgente Drupal:

// Set return value for the service 
$return = array(); 
if ($method['#return']) { 
    **// Don't let a struct be declared as return parameter, because nusoap will not 
    // Send back anything.** 
    $return['return'] = 'xsd:'. $method['#return']; 
    if ($method['#return'] == 'struct' || $method['#return'] == 'array') { 
    $return['return'] = 'xsd:Array'; 
    } 
} 

Spero che questo aiuti qualcun altro che ha lottato con lo stesso problema.

+0

Il bit sull'impostazione del valore di ritorno al 'xsd: Array' indipendentemente dal personalizzato definito ComplexType mi ha salvato! Bene, dopo circa una settimana di inseguimento di questo bug * UnDocumented * in NuSOAP. – Kingsolmn

+0

Non sono in PHP. Dove metti quel codice? –

Problemi correlati