我正在使用PHP SoapClient来消费web服务。
一切都工作良好,当服务参数是简单的,像$client->GetProductById(array('productId' => 'ID'));
但是我需要访问的一个服务,需要更复杂的参数…我已经使用SoapUI来测试web服务,使用SoapUI我可以很容易地使它工作。
问题是,我不能使它与PHP SoapClient工作,我根本找不到一种方法来表示所有这些参数..
发送到服务器的Soap消息如下(从SoapUI复制)
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:slps="http://www.microsoft.com/slps/">
<soapenv:Header/>
<soapenv:Body>
<slps:GetLicensesByFilter>
<slps:filter>
<slps:ExcludeCommercial>false</slps:ExcludeCommercial>
<slps:ExcludeTrial>false</slps:ExcludeTrial>
<slps:IssueDateRange>
<slps:End>2011-12-31T00:00:00.000Z</slps:End><slps:Start>2011-11-01T00:00:00.000Z</slps:Start>
</slps:IssueDateRange>
<slps:ProductId>1275b704-7622-c2xx-922e-76186497f744</slps:ProductId>
<slps:SkuId>A35138F43-0119-0719-802a-B48CCE6229A4</slps:SkuId>
</slps:filter>
<slps:retrievalOptions>LicenseInfo</slps:retrievalOptions><slps:pageIndex>0</slps:pageIndex>
</slps:GetLicensesByFilter>
</soapenv:Body>
</soapenv:Envelope>
我认为这里的方法是根据你的*生成相关的php类。wsdl文件。这可以使用像wsdl2php --> http://www.urdalen.no/wsdl2php/这样的工具来完成。
之后,您可以使用生成的Service类来执行您的webservice调用,或者您可以在创建Soap客户机实例时仅获取相关类并使用"classmap"选项。
由问题的原作者,从问题移到答案:
edit:我终于明白了;)
可能不是最好的方法,但它是有效的,我遵循了一个用户在PHP论坛留下的提示…基本上我必须创建一些类来表示参数结构,然后当我不得不使用SoapClient的'classmap'选项将WSDL类型映射到我的PHP类…