2009-09-22 25 views
8

Chcę zwrócić tablicę obiektów artykułów w usłudze sieciowej PHP, używając nuSOAP v 1.114. To jest jak skonfigurować WSDL:Zwracanie tablicy obiektów w PHP Web Service

$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' 
); 

Moja klasa PHP artykuł jest bardzo prosta:

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

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

Jeśli wrócę tylko nowy artykuł Object, tak:

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

funkcja, zarejestrowana jako:

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

działa dobrze i zwraca artykuł tak, jakby był tablicą. Jednakże, jeśli spróbuję i zwrócę ArrayOfArticleType (skomentowana linia w TestArrayReturn()) i zarejestruj funkcję jako typ zwracany tns: ArrayOfArticleType, to kończy się niepowodzeniem z Error: HTTP Error: no data present after HTTP nagłówków.

Jeśli jednak utworzyć tablicy tablic ręcznie, tak jak poniżej:

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

to działa !? Co jest nie tak z moim opisem WSDL ArrayOfArticleType, który nie pozwala mu poprawnie serializować obiektów ArticleType, ale poprawnie serializuje tablicę asocjacyjną o tych samych właściwościach ("articleId", "heading", "text")?

Przepraszam za cały kod, ale uważam, że konieczne jest wskazanie błędu, który przeoczyłem. Każda pomoc doceniona, miałem problemy z ustawieniem WSDL dla tej usługi na kilka dni.

Odpowiedz

4

Naprawiłem ten błąd. Dla wszystkich zainteresowanych wydaje się, że jest to błąd w NuSOAP. MUSISZ zarejestrować swój returnType dla funkcji jako xsd: Array dla poprawnego zwrócenia tablicy, nawet jeśli poprawny WSDL będzie ją określać jako "tns: ArrayOfArticleType". Znalazłem to w pewnym kodzie źródłowym 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'; 
    } 
} 

nadzieję, że pomoże ktoś inny, kto zmagał się z tym samym problemem.

+0

Bit o ustawienie wartości zwracanej do „xsd: Array” niezależnie od tego zwyczaju zdefiniowany ComplexType mnie uratował! Po około tygodniu ścigania tego * nieudokumentowanego * błędu w NuSOAP. – Kingsolmn

+0

Nie jestem w PHP. Gdzie umieścisz ten kod? –