PHP SoapClient настроен для WSDL с документом стиля и литералом тела - PullRequest
0 голосов
/ 29 марта 2012

Я взаимодействую с веб-сервисом 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 иметь дело с цепным импортом, подобным этому?

1 Ответ

1 голос
/ 30 марта 2012

В итоге мне пришлось пропустить использование WSDL и указать местоположение, uri, стиль и использовать в качестве аргументов конструктор SoapClient.стиль установлен на SOAP_DOCUMENT, а use установлен на 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 + forward slash + (т.е. $uri.'/'.$operation), в качестве третьего аргумента __soapCall ().

...