PHP SoapClient, настроен за WSDL със стилов документ и основен литерал

Взаимодействам с WCF уеб услуга, която излага метода си с помощта на SOAP, използвайки PHP 5.3.10. Надявам се да мога да използвам 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 да се справи с верижен импорт като този?


person Reuben    schedule 28.03.2012    source източник


Отговори (1)


В крайна сметка трябваше да пропусна използването на WSDL и да посоча местоположението, uri, стила и използването като аргументи на конструктора SoapClient. стилът е зададен на SOAP_DOCUMENT, а употребата е зададена на SOAP_LITERAL.

Когато извиквате __soapCall(), вторият аргумент е SoapVar, обвиващ необработен XML, в масив (т.е. $data = array(new SoapVar($xmlString, XSD_ANYXML));). Ако сте генерирали своя XML с помощта на SimpleXML::asXML(), не забравяйте първо да премахнете заглавката <?xml version="1.0" encoding="UTF-8"?>.

Освен това, тъй като говоря с уеб услуга на WCF, изложена като SOAP (т.е. .NET SOAP), SOAPAction изисква разделител с наклонена черта вместо стандартния PHP хеш. За да направите това, подайте масив със запис „soapaction“, който е uri + наклонена черта + операция (т.е. $uri.'/'.$operation), като трети аргумент на __soapCall().

person Reuben    schedule 30.03.2012