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


PHP use SoapClient don't add namespace to child nodes in request envelope

>我正在尝试让 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,它是实现子级命名空间插入的唯一解决方案。