zoukankan      html  css  js  c++  java
  • 用 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
  • 相关阅读:
    成为一个会思考的学习者
    我的第4篇博客
    我的第3篇博客
    第2次作业
    第一次作业:大学,人生的另一个新的开始
    第四次作业
    第三次作业
    第二次作业
    作为大一新生的感悟
    第四次作业
  • 原文地址:https://www.cnblogs.com/ooooo/p/2240570.html
Copyright © 2011-2022 走看看