我正在使用PHP 5.3.10与使用SOAP公开其方法的WCF Web服务连接。我希望能够使用SoapClient,但我无法正确制定请求。
WSDL似乎是1.0(xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/
标记中的wsdl:definitions
。
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>
我想将主体的请求创建为数组,以便肥皂体最终看起来像这样:
<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可以像这样处理链式导入吗?
答案 0 :(得分:1)
我最终不得不跳过使用WSDL,并指定位置,uri,样式和用作SoapClient构造函数的参数。 style设置为SOAP_DOCUMENT,use设置为SOAP_LITERAL。
当调用__soapCall()时,第二个参数是一个包装原始XML的SoapVar,在一个数组中(即$data = array(new SoapVar($xmlString, XSD_ANYXML));
)。如果您使用SimpleXML :: asXML()生成XML,请务必先删除<?xml version="1.0" encoding="UTF-8"?>
标题。
另外,因为我正在谈论一个暴露为SOAP(即.NET SOAP)的WCF Web服务,所以SOAPAction需要一个正斜杠分隔符,而不是默认的PHP哈希。为此,传递一个数组,其中'soapaction'条目是uri +正斜杠+操作(即$uri.'/'.$operation
),作为__soapCall()的第三个参数。