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