NuSoap - 允许使用addComplexType中的嵌套数组吗?

时间:2014-07-27 17:03:17

标签: php xml nusoap

我需要从客户端接收这样的XML输入(包含2个或更多元素):

<list>
  <item>
      <code xsi:type="xsd:string">123</code>
      <product xsi:type="xsd:string">hello</product>
      <level xsi:type="xsd:float">3</level> 
  </item>

  <item>
      <code xsi:type="xsd:string">1234</code>
      <product xsi:type="xsd:string">hello2</product>
      <level xsi:type="xsd:float">4</level> 
  </item>
</list>

我可以定义一个这样的complexType来描述服务方法的输入参数(使用数组(array(...)?

     $server->wsdl->addComplexType(
       'name',
       'complexType',
       'struct',
       'all',
       '',
        array (array (
          'code' => array('name' => 'code', 'type' => 'xsd:string'),
          'product' => array('name' => 'product', 'type' => 'xsd:string'),
          'level' => array('name' => 'level', 'type' => 'xsd:float')
      ))
    );

    $server->register('updateCode',                    // method name
             array('name' => 'tns:name'),          // input parameters
             array('return' => 'xsd:string'),    // output parameters
             'urn:updateCode',                         // namespace
             'urn:updatecode#updateCode',                   // soapaction
             'rpc',                                    // style
             'encoded'                                // use

    );

    function updateCode($input){
            return count($input);
    }

当我使用包含2个项目的XML时,我获得2作为响应;当我使用只有1个项目的XML时,我得到3作为响应(就像每个项目的数字一样),我期望得到1作为结果。

我不明白为什么会这样。

谢谢,

1 个答案:

答案 0 :(得分:0)

问题有点陈旧,但我正在研究一些传统的肥皂服务并遇到过它。

这个SO答案可能有所帮助:https://stackoverflow.com/a/1505720/1666805

问题1) 您需要声明2个复杂类型,其中第一个是“列表”:

$soap->wsdl->addComplexType(
    'list',
    'complexType',
    'array',
    '',
    'SOAP-ENC:Array',
    array(
        'list' => array(
          'name' => 'list', 'type' => 'tls:item'
        )
     ),
     array(
        array(
            'ref'=>'tns:item',
            'wsdl:arrayType'=>'tns:item[]'
        )
     ),
   'tns:item'
);

第二个有参数“element”:

$soap->wsdl->addComplexType(
    'item',
    'element',
    'struct',
    'all',
    '',
    array(
        'code' => array('name' => 'code', 'type' => 'xsd:string'),
        'product' => array('name' => 'product', 'type' => 'xsd:string'),
        'level' => array('name' => 'level', 'type' => 'xsd:float')
    )
);

从这里开始,使用上面的列表类型作为输入注册函数应该很容易。

问题2) 我会看一下传递给函数的实际数组而不是count:

array(1) {
  'item' =>
  array(2) {
    [0] =>
    array(3) {
      'code' =>
      string(3) "123"
      'product' =>
      string(5) "hello"
      'level' =>
      double(3)
    }
    [1] =>
    array(3) {
      'code' =>
      string(4) "1234"
      'product' =>
      string(6) "hello2"
      'level' =>
      double(4)
    }
  }
}