8

我想使用 nuSOAP v 1.114 在 PHP Web 服务中返回一组文章对象。这就是我设置 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;
}
}

如果我只返回一个新的文章对象,如下所示:

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 的 ARRAY,如下所示:

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

有用!?我的 ArrayOfArticleType WSDL 描述有什么问题,它不允许它正确序列化 ArticleType 对象,但正确序列化具有相同属性(“articleId”、“heading”、“text”)的关联数组?

对不起所有的代码,但我觉得有必要查明我忽略的错误。任何帮助表示赞赏,几天来我一直在努力为此服务设置 WSDL。

4

2 回答 2

5

我修复了这个错误。对于任何感兴趣的人,这似乎是 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';
  }
} 

希望这可以帮助其他遇到同样问题的人。

于 2009-09-22T14:29:57.093 回答
0

这是客户端和服务器的示例,用于如何使用 php Web 服务返回数组。这是一个易于理解的示例 http://my-source-codes.blogspot.com/2011/10/php-web-service-return-数组.html

于 2012-01-23T17:09:04.297 回答