>我正在尝试让 SoapRequest 工作,但这些要求似乎不适用于标准的 PHP soap 客户端。
我已经简化了代码,但问题仍然很明显:
我正在这样做:
$client = new SoapClient('http://example.com?WSDL', array('trace' => 1));
$client->MakeRequest([
'root' => [
'attribute' => 'value',
'node' => [...]
]
]);
结束发出这样的请求
<ns1:root attributes="value">
<ns1:node>...</ns1:node>
</ns1:root>
但我真正需要的是请求看起来像这样。
<ns1:root attributes="value">
<node>...</node>
</ns1:root>
我已经尝试了很多不同的解决方案,将SoapVar
用于数据结构的不同部分,但我从来没有得到我想要的,要么我的问题是属性被转换为节点,要么根命名空间(来自 WSDL 定义)被添加到子节点,这使得我正在集成的第三方服务失败。
是否有任何技巧或库可以帮助我解决这个问题,这样我就可以避免手动构建 XML 并将其发送到服务。
恐
怕唯一的方法是使用SOAP_ENC_OBJECT
编码创建具有足够命名空间定义的SoapVar
:
new 'SoapVar($val, SOAP_ENC_OBJECT, null, null, $nodeName, $namespace);
并在递归函数中调用它。AFAIR,它是实现子级命名空间插入的唯一解决方案。