Я хочу вернуть массив объектов статьи в веб-сервисе PHP, используя nuSOAP v 1.114. Вот как я настроил WSDL:
$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'
);
Мой класс PHP Article очень прост:
class Article {
public $articleId;
public $heading;
public $text;
public function __construct($articleId, $heading, $text=NULL) {
$this->articleId = $articleId;
$this->heading = $heading;
$this->text = $text;
}
}
Если я верну только новый объект Article, например:
function TestArrayReturn() {
$arr = new Article(12345, "Test heading", "Test text.");
//$arr2 = array($arr);
return $arr;
}
функция, зарегистрированная как:
$server->register("TestArrayReturn", array(), array('return'=>'tns:ArticleType'), $namespace, $namespace."#TestArrayReturn", 'rpc', 'encoded', 'Test function');
отлично работает и возвращает статью, как будто это массив. Однако если я попытаюсь вернуть ArrayOfArticleType (закомментированную строку в TestArrayReturn ()) и зарегистрирую функцию как тип возврата tns: ArrayOfArticleType, то произойдет сбой с ошибкой: Ошибка HTTP: после заголовков HTTP данные отсутствуют.
Если, однако, я создаю Массив массивов вручную, например, так:
$arr = array("articleId"=>12345, "heading"=>"Test heading", "text"=>"Test text");
$arr2 = array("articleId"=>12345, "heading"=>"Test heading", "text"=>"Test text");
return array($arr, $arr2);
это работает !? Что не так с моим описанием WSDL ArrayOfArticleType, которое не позволяет правильно сериализовать объекты ArticleType, но корректно сериализует ассоциативный массив с такими же свойствами ("articleId", "heading", "text") ??
Извините за весь код, но я чувствую, что необходимо точно определить ошибку, которую я пропускаю. Любая помощь приветствуется, я несколько дней пытался настроить WSDL для этой службы.