修改PHP的SoapClient消息的主体

时间:2013-10-03 16:49:27

标签: php .net wcf soap

是否可以修改PHP SoapClient请求的主体,以便soap参数包含在方法节点中?

这可能需要一些背景知识。

我正在使用.NET和WCF构建的SOAP 1.2 Web服务。

PHP的SoapClient,此服务不想互相交谈。通过明智地使用SoapHeaderSoapParam个对象,我已经解决了大部分问题,但仍然存在一个问题,即我无法找到优雅的解决方案。我希望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中的内容同样的结局。我没有想到的替代解决方案非常受欢迎。

0 个答案:

没有答案