Нужна помощь с __soapCall()

freeentr

Новичок
Приветствую!

Пытаюсь подключиться к сервису. Порядок примерно следующий; 1.Выполняется авторизация, 2.Делается запрос, 3.Получаем данные на основе введённых значений в шаге 2.
Привожу пример wsdl на сервере:
PHP:
    <s:element name="Logins">
            <s:complexType>
                    <s:sequence>
                            <s:element minOccurs="1" maxOccurs="1" name="loging"
                                    type="tns:LoginInput" />
                    </s:sequence>
            </s:complexType>
    </s:element>
    <s:complexType name="LoginInput">
            <s:sequence>
                    <s:element minOccurs="0" maxOccurs="1" name="login" type="s:string" />
                    <s:element minOccurs="0" maxOccurs="1" name="password" type="s:string" />
            </s:sequence>
    </s:complexType>
    <s:element name="LoginsResponse">
            <s:complexType>
                    <s:sequence>
                            <s:element minOccurs="1" maxOccurs="1" name="LoginsResult"
                                    type="tns:LoginOutput" />
                    </s:sequence>
            </s:complexType>
    </s:element>
    <s:complexType name="LoginOutput">
            <s:sequence>
                    <s:element minOccurs="1" maxOccurs="1" name="loginresult"
                            type="s:boolean" />
                    <s:element minOccurs="0" maxOccurs="1" name="errormsg" type="s:string" />
            </s:sequence>
    </s:complexType>
    <s:element name="Kasko_data">
            <s:complexType>
                    <s:sequence>
                            <s:element minOccurs="1" maxOccurs="1" name="inf"
                                    type="tns:InputKasko" />
                    </s:sequence>
            </s:complexType>
    </s:element>
    <s:complexType name="InputKasko">
            <s:sequence>
                    <s:element minOccurs="0" maxOccurs="1" name="regnum" type="s:string" />
                    <s:element minOccurs="0" maxOccurs="1" name="regapl" type="s:string" />
            </s:sequence>
    </s:complexType>
    <s:element name="Kasko_dataResponse">
            <s:complexType>
                    <s:sequence>
                            <s:element minOccurs="1" maxOccurs="1" name="Kasko_dataResult"
                                    type="tns:OutputKasko" />
                            <s:element minOccurs="0" maxOccurs="1" name="AP_Active"
                                    type="tns:ArrayOfString" />
                            <s:element minOccurs="0" maxOccurs="1" name="AP_Errors"
                                    type="tns:ArrayOfString" />
                            <s:element minOccurs="0" maxOccurs="1" name="AP_Avail"
                                    type="tns:ArrayOfString" />
                            <s:element minOccurs="0" maxOccurs="1" name="CR_Errors"
                                    type="tns:ArrayOfString" />
                    </s:sequence>
            </s:complexType>
    </s:element>
    <s:complexType name="OutputKasko">
            <s:sequence>
                    <s:element minOccurs="0" maxOccurs="1" name="atlpiem" type="s:string" />
                    <s:element minOccurs="0" maxOccurs="1" name="persona" type="s:string" />
            </s:sequence>
    </s:complexType>
    <s:complexType name="ArrayOfString">
            <s:sequence>
                    <s:element minOccurs="0" maxOccurs="unbounded" name="string"
                            nillable="true" type="s:string" />
            </s:sequence>
    </s:complexType>
На основе этих объектов я сделал скрипт запроса, но не получается авторизироватся во время 2-го шага. Ниже в скрипте я два раза обращаюсь к серверу (__soapCall) - Первый Logins и второй Kasko_data. Logins проходит хорошо, а для Kasko_data похоже начинается новая сессия и соответственно авторизация не происходит (т.к. нет Logins в массиве пареметров).
Можно ли как-то реализовать это остоваясь в одной сессии?
Скрипт:
PHP:
    public function calculate ($post, $begindate){
     
                    try{
                            $client = new SoapClient (URL, array(
                                    'connection_timeout' => 10,
                                    'timeout' => 10
                            ));
                            $ServiceParameters = array(
                                    'LoginInput' => array(
                                            'loging' => array(
                                                    'login' => USER,
                                                    'password' =>PASSWORD
                                            )
                                    )
                            );
                            $serviceResult = $client->__soapCall ('Logins', $ServiceParameters);
                            if ($serviceResult->LoginsResult->loginresult == true){
                                    $data = array(
                                            'InputKasko' => array(
                                                    'inf' => array(
                                                            'regapl' => $post['prop_vehicle_license_regno'],
                                                            'regnum' => $post['prop_vehicle_licenseplate']
                                                    )
                                            )
                                    );
                                    $kaskoResult = $client->__soapCall ('Kasko_data', $data);
                                    return array(
                                            'raw' => $kaskoResult
                                    );
                            }
                            else{
                                    return array(
                                            'error' => $serviceResult->LoginsResult->errormsg
                                    );
                            }
                   
                    }
                    catch (SoapFault $e){
                            return array(
                                    'error' => $e->getMessage (),
                                    'code' => $e->getCode (),
                                    'line' => $e->getLine ()
                            );
                    }
           
     
            }
Благодарю!
 

dadoc

Новичок
Вам надо после первого запроса посмотреть какие cookie были установлены сервером ($client->__getLastResponseHeaders() или $client->_cookies) и перед вторым вызовом установить их ($client->__setCookie())
 

freeentr

Новичок
Да в том-то и дело, что нет их там:
"HTTP/1.1 200 OK Date: Thu, 26 Apr 2012 06:57:29 GMT Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET X-AspNet-Version: 2.0.50727 Cache-Control: private, max-age=0 Content-Type: text/xml; charset=utf-8 Content-Length: 379 ".

Был хотя бы какой ключ сессии с сервера, но и его нет. Это может быть недоработкой на стороне сервера?
 

baev

‹°°¬•
Команда форума
freeentr, почему Вы здесь спрашиваете, а не у владельцев сервера?
 

freeentr

Новичок
freeentr, почему Вы здесь спрашиваете, а не у владельцев сервера?
это логично конечно, просто подумал, что может soapclient может обратиться к двум функциям одновременно… +основываясь на wsdl, проверить корректность моего скрипта.
 

dadoc

Новичок
Вы полный wsdl сюда залейте, может там надо через headers в заголовке SOAP пакета передавать login/password.

Самый простой вариант, как подметил baev, спросить у владельцев веб сервиса как они задумывали авторизацию.
 

freeentr

Новичок
Вы полный wsdl сюда залейте, может там надо через headers в заголовке SOAP пакета передавать login/password.
Так авторизация через функцию Logins происходит. А даннные я должен вытащить через функцию Kasko_data. Только я не вижу логику связывающую эти две функции. Поэтому интересно - это недоработка у владельцев сервера, либо мои лыжи не едут. Файл прикрепил.

С владельцами ведётся общение по мейлу…обещались посмотреть, но пока жду, есть спортивный интерес к конкретному случаю. Потому как в других случаях, я брал предусмотренный ключ сессии либо id и с ним авторизировался. А тут нет такого.
 

Вложения

Сверху