1

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

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

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

PHPSoapClient和该服务不想互相交谈。通过明智地使用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>

但是,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到同一端。我没有想到的替代解决方案非常受欢迎。

4

0 回答 0