Параметры метода PHP-Soap pass - PullRequest
7 голосов
/ 01 мая 2009

У меня относительно нет опыта работы с 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>

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

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

Ответы [ 5 ]

14 голосов
/ 06 июня 2009

Работая сегодня над слегка связанной проблемой, я обнаружил, что следующий 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 используются два массива для передачи параметров. Первый массив содержит параметры и их имена. Второй содержит первый массив. Интересный синтаксис, я знаю. : -)

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

[OperationContract]
string runStep(string step, string value);
3 голосов
/ 22 марта 2012

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

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

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

1 голос
/ 07 августа 2015
This is valid way: right mr.bgondy
$result = $soapClient->methodsomefunction("params1"=>"value","params2"=>"value2");

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

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

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

0 голосов
/ 24 сентября 2014

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

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

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

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

0 голосов
/ 29 мая 2009

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

$client->__soapCall('methodName',array('requestObj'=>$requestObj));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...