用 nuSOAP解决传递对象数组的问题

简介:这是用 nuSOAP解决传递对象数组的问题的详细页面,介绍了和php,php 用 nuSOAP解决传递对象数组的问题有关的知识、技巧、经验,和一些php源码等。

class='pingjiaF' frameborder='0' src='http://biancheng.dnbcw.info/pingjia.php?id=347708' scrolling='no'>

准备工作

首先定义一个类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命名空间,假设www.my400800.cn
$soap -> configureWSDL( ' www.my400800.cn ' , ' urn: www.my400800.cn ' );

// ... ...

$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 UserInfo could 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!通过了,一切顺利。

爱J2EE关注Java迈克尔杰克逊视频站JSON在线工具

http://biancheng.dnbcw.info/php/347708.html pageNo:4

posted on 2011-11-08 07:51  圣者  阅读(213)  评论(0编辑  收藏  举报

导航