nusoap传递对象数组

原文:http://www.cnblogs.com/Jaypei/archive/2009/04/09/1432521.html

上一次成功的使用nuSOAP传递对象,实际生产过程中经常还有另外一个需求,就是远程返回对象数组。花了一下午的时间终于成功测试成功,于是迫不及待的拿出来给大家分享:)

 

准备工作

 

首先定义一个类UserInfo:

class  UserInfo {
    
var   $UserName ;
    
// ...
     var   $Sequence ;
}

 

然后写一个测试用的远程方法:

复制代码
function  hello() {
    
$a   =   new  UserInfo();
    
$a -> UserName  =   " Jaypei " ;
    
$a -> Sequence  =   1928388199 ;
    
$b   =   new  UserInfo();
    
$b -> UserName  =   " cnblogs " ;
    
$b -> Sequence  =   83910021 ;
    
return   array ( $a ,   $b );
}
复制代码

一个普通的nuSOAP程序如下:(整个过程是对它的改造)

复制代码
$soap   =   new  soap_server();
//  使用UTF-8
$soap -> soap_defencoding  =   ' UTF-8 ' ;
$soap -> decode_utf8  =   false ;
//  需设置WSDL命名空间,假设jaypei.cnblogs.com
$soap -> configureWSDL( ' jaypei.cnblogs.com ' ,   ' urn:jaypei.cnblogs.com ' );

// ... ...

$soap -> register( ' hello ' );

$soap->service($HTTP_RAW_POST_DATA);

复制代码

 

 

改造过程

 

首先,注册一个UserInfo的复合类型,方法如下:(这个之前已写过)

复制代码
$soap -> wsdl -> addComplexType(
    
' UserInfo ' ,  
    
' complexType ' ,  
    
' struct ' ,  
    
' all ' ,
    
'' ,
    
array (
        
' UserName ' => array ( ' name ' => ' UserName ' ,   ' type ' => ' xsd:string ' ) ,
        
' Sequence ' => array ( ' name ' => ' Sequence ' ,   ' type ' => ' xsd:int ' )
    ));
复制代码


这样就可以通过以下方式返回一个单一的UserInfo对象:(hello中返回$a或者返回$b)

$soap->register('hello', array(),array('return'=>'tns:UserInfo'));

 

如果要返回一个列表,则需要改动return处的类型。起初找到了返回string或int等基础类型的列表方法,如下:

$soap->register('hello', array(), array('return'=>'SOAP-ENC:Array') );

 

当这个方法用到自定义复合类型上时类型处会变成:

xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="object[2]"

 

object并不是我们想要的。于是上网找相关资料发现了如下方法:

$soap->register('hello', array(), array('return'=>'tns:UserInfoArray') );


这里要自定义添加一个tns:UserInfoArray的数组类型,方法如下:

复制代码
$soap -> wsdl -> addComplexType(
    
' UserInfoArray ' ,
    
' complexType ' ,
    
' array ' ,
    
'' ,
    
' SOAP-ENC:Array ' ,
    
array () ,
    
array (
        
array ( ' ref ' => ' SOAP-ENC:arrayType ' , ' wsdl:arrayType ' => ' tns:UserInfo[] ' )
    )
,
    
' tns:UserInfo '
);
复制代码

 

此时代码部分已完成,但是调用时nuSOAP缺报错了,是一个PHP错误:

Catchable fatal error: Object of class UserInfocould not be converted to string in ...\nusoap\nusoap.php on line 6002

 

于是找到nusoap.php的6002行看一下为何UserInfo向string转换:

$this->debug("serializing array element: $k, $v of type: $typeDef[arrayType]");

代码没有多看,不过很明显只是个debug的代码,没什么实际作用。于是直接注释掉继续调用,OK!通过了,一切顺利。

 

注:这个错误现在还不知是因为我的使用方法有违了设计本意还是nuSOAP本身的bug,反复列举了一些应用都没有什么问题后就算是成功了,如果有什么错误还请大家指正。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值