我需要从客户端接收这样的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作为结果。
我不明白为什么会这样。
谢谢,
答案 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)
}
}
}