PHP使用SoapClient不会在请求信封中向子节点添加命名空间

时间:2016-07-14 07:32:56

标签: php soap

我试图让SoapRequest工作,并且这些要求似乎与标准的PHP soap客户端无关。

我已经简化了代码,但问题仍然很明显:

我这样做:

$client = new SoapClient('http://example.com?WSDL', array('trace' => 1));
$client->MakeRequest([
  'root' => [
    'attribute' => 'value',
    'node' => [...]
  ]
]);

哪个结束了op这样的请求

<ns1:root attributes="value">
  <ns1:node>...</ns1:node>
</ns1:root>

但我真正需要的是请求看起来像这样。

<ns1:root attributes="value">
  <node>...</node>
</ns1:root>

我已经尝试了很多不同的解决方案,使用SoapVar来处理数据结构的不同部分,但我从来没有得到我想要的结果,或者我的问题是属性转换为节点或根命名空间(来自WSDL定义)被添加到子节点,这使得我与第三方服务集成失败。

是否有任何技巧或库可以帮助我,所以我可以避免手动构建XML并将其发送到服务。

1 个答案:

答案 0 :(得分:0)

我担心唯一的方法是使用SoapVar编码创建具有足够名称空间定义的SOAP_ENC_OBJECT

new \SoapVar($val, SOAP_ENC_OBJECT, null, null, $nodeName, $namespace);

在你的递归函数中调用它。 AFAIR,它是实现儿童名称空间插入的唯一解决方案。