Параметры метода передачи PHP-Soap

У меня относительно нет опыта работы с SOAP. Я пытаюсь работать с веб-службой для клиента, используя режим WSDL. У меня возникли проблемы с передачей параметров с помощью метода и получением параметров, которые должны отображаться в запросе по мере необходимости. Я использую стандартный класс мыла php.

Мне нужно, чтобы мой запрос SOAP был структурирован следующим образом:

 <?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://hostserver/">
    <SOAP-ENV:Body>
        <ns1:DoLogin>
            <ns1:request>
                <ns1:Session>
                    <ns1:SessionId>00000000-0000-0000-0000-000000000000</ns1:SessionId>
                </ns1:Session>
                <ns1:UserCredential>
                    <ns1:UserName>username</ns1:UserName>
                    <ns1:Password>password</ns1:Password>
                    <ns1:ApplicationID>00000000-0000-0000-0000-000000000000</ns1:ApplicationID>
                    <ns1:ClientID>00000000-0000-0000-0000-000000000000</ns1:ClientID>
                    <ns1:ClientVersion>V1.0</ns1:ClientVersion>
                </ns1:UserCredential>
            </ns1:request>
        </ns1:DoLogin>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

В php я вызываю функцию так:

$client->DoLogin($args);

И запрос заканчивается так:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://hostserver/"><SOAP-ENV:Body><ns1:DoLogin/></SOAP-ENV:Body></SOAP-ENV:Envelope>

Независимо от того, как я передаю аргументы (одиночные переменные, массив, объект класса), я не могу получить запрос на такую ​​​​структуру.

Может кто-нибудь помочь мне? Я уверен, что это будет что-то очень простое.


person Fabian    schedule 01.05.2009    source источник


Ответы (5)


Сегодня, работая над немного похожей проблемой, я обнаружил, что следующий PHP-запрос сгенерировал SOAP-запрос, показанный ниже:

$sc = new SoapClient($url);
$params = array('step' => 'ShippingInfo', 'value' => "hello");
$result = $sc->__soapCall('runStep', array('parameters' => $params));
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/">
 <SOAP-ENV:Body>
  <ns1:runStep>
     <ns1:step>ShippingInfo</ns1:step>
     <ns1:value>hello</ns1:value>
  </ns1:runStep>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Одна загвоздка, которую я обнаружил, заключалась в том, что если параметры ($params), которые я передал, не соответствовали тому, что было указано в файле WSDL, сообщение, сгенерированное клиентом SOAP, выглядело бы похоже на то, на что вы жалуетесь: сообщение с телом содержит нет значения данных. Интересно, твоя проблема здесь?

Также обратите внимание, как вышеприведенный PHP использует два массива для передачи параметров. Первый массив содержит параметры и их имена. Второй содержит первый массив. Интересный синтаксис, я знаю. :-)

К вашему сведению, приведенный выше пример кода используется для связи со службой C# .Net WCF, имеющей следующий контракт:

[OperationContract]
string runStep(string step, string value);
person Ben Gribaudo    schedule 05.06.2009
comment
Извините за комментирование старой ветки, но это преобразование $params в виде массива при вызове функции сработало для меня. Спасибо, Бен. - person etm124; 02.12.2011
comment
На самом деле вы можете просто передать массив из массива: array($params) и он будет работать так же. - person nikita2206; 25.04.2013
comment
Вы спасли мне жизнь прямо сейчас, Бен Грибаудо :) $sc-›FuncName(array(param =› value)) передает параметры, как и ожидалось, но $sc-›__soapCall(FuncName, array(param =› value) не передает никаких параметров Поместите параметры в массив (параметры = > $ параметры) сделал свое дело Большое спасибо, чувак. - person sajushko; 08.02.2017

попробуй это:

$soapClient->__soapCall('methodToCall', array('parameters' => $yourParamsArray));

Это сработало для меня с веб-службой .NET.

person bgondy    schedule 22.03.2012

This is valid way: right mr.bgondy
$result = $soapClient->methodsomefunction("params1"=>"value","params2"=>"value2");

мой вопрос в том, что вы сказали

$soapClient->__soapCall('methodToCall', array('parameters' => $yourParamsArray));

приведенный выше код для веб-служб .net, но когда я попробовал этот метод для веб-служб .net asp, значения параметров не анализируются, я так думаю, потому что, когда я удалил params = value, не произошло то же самое «Произошла неизвестная ошибка!» из веб-сервисов .net asp в iframe.

person knsmith    schedule 07.08.2015

У меня такая же проблема.

Это решило для меня:

$result = $soapClient->somefunction(array( "param1" => "value1", "param2" => "value2" ));

Типы параметров (и порядок) должны совпадать с тем, что определяет текущий wsdl. (строка, объект и т. д.)

person Face666    schedule 24.09.2014

попробуй это,

$client->__soapCall('methodName',array('requestObj'=>$requestObj));
person Posto    schedule 29.05.2009