我想使用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文章类非常简单:
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);
有用!?我的ArrayOfArticleType WSDL描述有什么问题,它不允许它正确序列化ArticleType对象,但是正确地序列化具有相同属性的关联数组("articleId","heading","text")??
对不起所有的代码,但我觉得有必要找出我忽略的错误.任何帮助表示赞赏,我一直在努力为这项服务设置WSDL好几天.
我修复了这个错误.对于任何感兴趣的人来说,这似乎是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'; } }
希望这可以帮助那些努力解决同样问题的人.