2009-09-22 15 views
8

Deseo devolver una matriz de objetos de artículo en un servicio web de PHP, utilizando nuSOAP v 1.114. Así es como me juego hasta la WSDL:Devolución de una matriz de objetos en el servicio web de 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' 
); 

Mi clase PHP artículo es muy simple:

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

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

Si regreso a un nuevo artículo de objetos, como este:

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

la función, registrada como:

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

funciona bien y devuelve el artículo como si fuera una matriz. Sin embargo, si intento devolver un ArrayOfArticleType (la línea comentada en TestArrayReturn()) y registro la función como return type tns: ArrayOfArticleType, entonces falla con Error: HTTP Error: no hay datos presentes después de los encabezados HTTP.

Si, sin embargo, crear una matriz de matrices de forma manual, así:

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

funciona !? ¿Qué hay de malo en mi descripción de ArrayOfArticleType WSDL que no permite serializar correctamente los objetos de ArticleType, pero serializar correctamente una matriz asociativa con las mismas propiedades ("articleId", "heading", "text") ??

Lo siento por todo el código, pero creo que es necesario identificar el error que estoy pasando por alto. Cualquier ayuda apreciada, he estado luchando con la configuración de WSDL para este servicio por días.

Respuesta

4

He solucionado este error. Para cualquier persona interesada, esto parece ser un error en NuSOAP. DEBE registrar su returnType para la función como xsd: Matriz para que devuelva correctamente la matriz, aunque la WSDL correcta la constituiría como 'tns: ArrayOfArticleType'. Encontré esto en algún código fuente de 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'; 
    } 
} 

Espero que esto ayude a alguien más que tuvo problemas con el mismo problema.

+0

El poco acerca de cómo establecer el valor de retorno a 'xsd: Array' independientemente de la costumbre definido ComplexType me salvó! Bueno, después de aproximadamente una semana de perseguir este error * No documentado * en NuSOAP. – Kingsolmn

+0

No estoy en PHP. ¿Dónde colocas ese código? –

Cuestiones relacionadas