PHP SoapClient为具有样式文档和正文文本的WSDL设置


PHP SoapClient set up for WSDLs with style document and body literal

我正在连接一个WCF web服务,该服务使用PHP 5.3.10使用SOAP公开其方法。我希望能够使用SoapClient,但我在正确制定请求时遇到了问题。

WSDL看起来是1.0(wsdl:definitions标记中的xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/)。

WSDL中的每个操作都是这样定义的:

<wsdl:operation name="GetPortfolios">
    <soap:operation soapAction="urn:IPortfolio/GetPortfolios" style="document"/>
    <wsdl:input>
        <soap:body use="literal"/>
    </wsdl:input>
    <wsdl:output>
        <soap:body use="literal"/>
    </wsdl:output>
 </wsdl:operation>

我想将主体的请求创建为一个数组,这样soap主体最终看起来像这样:

<GetPortfolios>
    <Portfolio>*con*</Portfolio>
    <Token>1234</Token>
</GetPortfolios>

这可以用PHP 5.3.10 SoapClient完成吗?(请举一个例子)。我更希望对SoapClient实例的调用调用__soapCall()。


更新:绑定之上是另一个WSDL的导入。

最初的WSDL是https://clienttest.praemium.biz/praemiumclientwebservice/PortfolioService.svc?wsdl.

导入看起来像:<wsdl:import namespace="" location="https://clienttest.praemium.biz/PraemiumClientWebService/PortfolioService.svc?wsdl=wsdl0"/>

该提供商在操作级别提供了有关请求和响应的进一步信息,还进行了另一项导入:

<xsd:schema targetNamespace="/Imports">
<xsd:import schemaLocation="https://clienttest.praemium.biz/PraemiumClientWebService/PortfolioService.svc?xsd=xsd0"/>
</xsd:schema>

正是这种导入详细说明了请求中预期的实际元素以及响应中预期的元素。

顺便说一句,PHP SoapClient能处理这样的链式导入吗?

我最终不得不跳过使用WSDL,并将位置、uri、样式和用途指定为SoapClient构造函数的参数。style设置为SOAP_DOCUMENT,use设置为SOAP_LITERAL。

当调用__soapCall()时,第二个参数是一个SoapVar包装原始XML的数组(即$data = array(new SoapVar($xmlString, XSD_ANYXML));)。如果您使用SimpleXML::asXML()生成了XML,请确保首先去掉<?xml version="1.0" encoding="UTF-8"?>标头。

此外,因为我所说的是以SOAP(即.NETSOAP)形式公开的WCF web服务,所以SOAPAction需要一个正斜杠分隔符,而不是默认的PHP哈希。要执行此操作,请将一个数组作为__soapCall()的第三个参数,其中"soapaction"条目为uri+正斜杠+运算(即$uri.'/'.$operation)。