Возвращение массива объектов в веб-сервисе PHP - PullRequest
8 голосов
/ 22 сентября 2009

Я хочу вернуть массив объектов статьи в веб-сервисе 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 для этой службы.

Ответы [ 2 ]

5 голосов
/ 22 сентября 2009

Я исправил эту ошибку. Для тех, кто заинтересован, это похоже на ошибку в NuSOAP. Вы ДОЛЖНЫ зарегистрировать свой returnType для функции как 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';
  }
} 

Надеюсь, это поможет кому-то еще, кто боролся с той же проблемой.

0 голосов
/ 23 января 2012

Вот пример как клиента, так и сервера, как вернуть массив с помощью веб-службы php. Это простой пример для понимания http://my -source-codes.blogspot.com / 2011/10 / PHP-веб-сервис возврата array.html

...