惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Privacy & Cybersecurity Law Blog
Vercel News
Vercel News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
N
Netflix TechBlog - Medium
罗磊的独立博客
F
Fortinet All Blogs
T
Threatpost
Y
Y Combinator Blog
博客园_首页
美团技术团队
Security Latest
Security Latest
博客园 - 三生石上(FineUI控件)
T
Tailwind CSS Blog
V
V2EX - 技术
The Cloudflare Blog
L
LINUX DO - 热门话题
博客园 - 司徒正美
Jina AI
Jina AI
P
Proofpoint News Feed
宝玉的分享
宝玉的分享
C
CXSECURITY Database RSS Feed - CXSecurity.com
C
Cybersecurity and Infrastructure Security Agency CISA
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
WordPress大学
WordPress大学
The Hacker News
The Hacker News
P
Privacy International News Feed
T
The Exploit Database - CXSecurity.com
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
V
V2EX
Stack Overflow Blog
Stack Overflow Blog
M
MIT News - Artificial intelligence
Latest news
Latest news
NISL@THU
NISL@THU
Google DeepMind News
Google DeepMind News
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cisco Blogs
雷峰网
雷峰网
Application and Cybersecurity Blog
Application and Cybersecurity Blog
B
Blog RSS Feed
W
WeLiveSecurity
D
DataBreaches.Net
G
Google Developers Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
GRAHAM CLULEY
Spread Privacy
Spread Privacy
Know Your Adversary
Know Your Adversary
TaoSecurity Blog
TaoSecurity Blog
S
Securelist
Help Net Security
Help Net Security

博客园 - Jaypei

archlinux中启用sshd [转] AT89C52资料 VirtualBox中安装PuppyLinux4 [转]比较全的Vim 中的正则表达式 luacurl的一个获得html的函数 [转]使用Mac OS X系统必须了解的10条命令 [原]Qt4.5中Plugins使用方法 粗心导致的gsoap一个错误 MinGW环境使用gSOAP rdesktop中剪切板共享 [转]在Windows XP下用GCC 4.3.2编译Qt 4.4.3实战 Ubuntu下安装Postgresql 8.3 [原创]关于python的Singleton [转]如何讀取文字檔? (C/C++) (STL) 简单的python读写windows剪切板 - Jaypei 关于SOAPpy传递对象参数调用WebService的问题总结 - Jaypei LinkedServer的用法 - Jaypei 解决Smarty中trancate使用UTF8时中文乱码问题 - Jaypei 关于wxPython中多线程修改主界面 - Jaypei
用nuSOAP传递对象数组的问题终于解决
Jaypei · 2009-04-09 · via 博客园 - Jaypei

2009-04-09 16:12  Jaypei  阅读(4585)  评论()    收藏  举报

上一次成功的使用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 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!通过了,一切顺利。

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