Я хочу вернуть массив объектов статьи в веб-службу 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-статьи очень прост:
class Article { public $articleId; public $heading; public $text; public function __construct($articleId, $heading, $text=NULL) { $this->articleId = $articleId; $this->heading = $heading; $this->text = $text; } }
Если я верну только новый объект статьи, вот так:
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-заголовков.
Если, однако, я создаю ARRAY of ARRAYS вручную, например:
$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 для этой службы в течение нескольких дней.
Я исправил эту ошибку. Для всех, кого это интересует, это, похоже, ошибка в NuSOAP. Вы ДОЛЖНЫ зарегистрировать свой возвращаемый тип для функции xsd: Array для правильного возврата массива, хотя правильный WSDL будет представлять его как «tns: ArrayOfArticleType». Я нашел это в некотором исходном коде 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'; } }
Надеюсь, это поможет кому-то другому, кто боролся с той же проблемой.
Вот пример как клиента, так и сервера для того, как вернуть массив с помощью веб-службы php. Легко понять http://my-source-codes.blogspot.com/2011/10/php-web-service-return- array.html