是否可以修改 PHPSoapClient
请求的主体,以便将soap 参数包含在方法节点中?
这可能需要一些背景知识。
我正在使用 .NET 和 WCF 中构建的 SOAP 1.2 Web 服务。
PHPSoapClient
和该服务不想互相交谈。通过明智地使用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>
但是,PHPSoapClient
发送的正文看起来更像这样
<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
到同一端。我没有想到的替代解决方案非常受欢迎。