微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在PHP Web服务中返回一个对象数组

我想使用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','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('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,"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';
  }
}

希望这可以帮助那些努力解决同样问题的人.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐