是否可以修改PHP SoapClient
请求的主体,以便soap参数包含在方法节点中?
这可能需要一些背景知识。
我正在使用.NET和WCF构建的SOAP 1.2 Web服务。
PHP的SoapClient
,此服务不想互相交谈。通过明智地使用SoapHeader
和SoapParam
个对象,我已经解决了大部分问题,但仍然存在一个问题,即我无法找到优雅的解决方案。我希望Stack Overflow上的某个人有答案。
根据Web服务文档,此服务需要一个看起来像这样的肥皂体
<soap:Body>
<ns1:GetProductList>
<ns1:PartnerID>xxxx</ns1:PartnerID>
<ns1:PartnerPassword>xxxx</ns1:PartnerPassword>
<ns1:DateStart>2013-07-01</ns1:DateStart>
<ns1:DateEnd>2013-10-01</ns1:DateEnd>
</ns1:GetProductList>
</soap:Body>
然而,PHP的SoapClient
发送的主体看起来更像是
<soap:Body>
<ns1:GetProductList/>
<ns1:PartnerID>xxxx</ns1:PartnerID>
<ns1:PartnerPassword>xxxx</ns1:PartnerPassword>
<ns1:DateStart>2013-07-01</ns1:DateStart>
<ns1:DateEnd>2013-10-01</ns1:DateEnd>
</soap:Body>
也就是说,它们不是GetProductList
方法中的参数,而是与<ns1:GetProductList/>
处于同一深度级别的节点。
现在,我可以通过使用我自己的SoalClient
类(CustomSoapClient
)和重新定义的__doRequest
//this code snippet is released under the shame license. You may reuse
//it provided you leave this comment in place and acknowledge what an awful
//solution regular expressing string replacing the soap message is
class CustomSoapClient extends SoapClient
{
function __doRequest($request, $location, $action, $version, $one_way = 0)
{
$request = preg_replace('%(<ns1:GetProductList/>)(.+?)</env:Body>%',
'<ns1:GetProductList>$2</ns1:GetProductList></env:Body>',$request);
return parent::__doRequest($request, $location, $action, $version, $one_way = 0);
}
}
然而,这显然不是最佳的。
我正在寻找一些神奇的咒语,用于SoapClient
类,将这些参数粘贴在方法节点中,或者经过充分测试和验证的一般代码,用于修改__doRequest
中的内容同样的结局。我没有想到的替代解决方案非常受欢迎。