PHP SoapServer всегда вызывает одну и ту же функцию, несмотря на то, что вызывает разные - PullRequest
0 голосов
/ 16 июня 2011

Мой SOAP-сервер (должен быть) настроен с тремя операциями: вход в систему, выход из системы и версия.

В настоящее время код функции входа в систему «подделывает» его, принимая два параметра: имя пользователя и пароль, автоматически «аутентифицируя» их, сохраняя их в переменных личного имени пользователя и пароля класса функции. У меня сеанс начался в точке входа действия веб-службы, и при установке класса функции в SoapServer во время инициализации я сохраняю соединения следующим образом:

       $this->setClass('WebSvcSoapFunctions');
       $this->setPersistence(SOAP_PERSISTENCE_SESSION); 

Когда я создаю SOAP CLIENT и вызываю свой сервис, независимо от того, какая функция вызывается, оказывается, что функция version () всегда выполняется, а не вызываемая. Я предполагаю, что это, вероятно, из-за того, как написан мой WSDL, но я не вижу проблемы (я новичок) ....

У меня есть следующее прослушивание WSDL через PHP SoapServer:

<?xml version="1.0" encoding="UTF-8"?>

<wsdl:types>

    <schema xmlns:rns="http://soap.jrimer-amp64/" xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://soap.jrimer-amp64/" version="1.0.0" elementFormDefault="unqualified" attributeFormDefault="unqualified">

        <complexType name="versionRequest">
        </complexType>

        <complexType name="versionResponse">
            <sequence>
                <element name="result" type="string" minOccurs="1"/>
            </sequence>
        </complexType>

        <complexType name="loginRequest">
            <sequence>
                <element name="username" type="string" use="required"/>
                <element name="password" type="string" use="required"/>
            </sequence>
        </complexType>

        <complexType name="loginResponse">
            <sequence>
                <element name="result" type="string" minOccurs="1"/>
            </sequence>
        </complexType>

        <complexType name="logoutRequest">
        </complexType>

        <complexType name="logoutResponse">
            <sequence>
                <element name="result" type="string" minOccurs="1"/>
            </sequence>
        </complexType>

    </schema>

</wsdl:types>


<wsdl:service name="XxxxxxSvc">

    <wsdl:port name="XxxxxxSvc-Endpoint0" binding="tns:XxxxxxSvc-Endpoint0Binding">
        <soap:address location="http://soap.jrimer-amp64/"/>
    </wsdl:port>

</wsdl:service>


<wsdl:portType name="portType">

    <wsdl:operation name="version">
        <wsdl:input message="tns:versionRequest"/>
        <wsdl:output message="tns:versionResponse"/>
    </wsdl:operation>
    <wsdl:operation name="login">
        <wsdl:input message="tns:loginRequest"/>
        <wsdl:output message="tns:loginResponse"/>
    </wsdl:operation>
    <wsdl:operation name="logout">
        <wsdl:input message="tns:logoutRequest"/>
        <wsdl:output message="tns:logoutResponse"/>
    </wsdl:operation>

</wsdl:portType>


<wsdl:binding name="XxxxxxSvc-Endpoint0Binding" type="tns:portType">

    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />

    <wsdl:operation name="version">
        <soap:operation style="document" soapAction="http://soap.jrimer-amp64/"/>
        <wsdl:input>
            <soap:body use="literal" parts="parameters"/>
        </wsdl:input>
        <wsdl:output>
            <soap:body use="literal" parts="parameters"/>
        </wsdl:output>
    </wsdl:operation>

    <wsdl:operation name="login">
        <soap:operation style="document" soapAction="http://soap.jrimer-amp64/"/>
        <wsdl:input>
            <soap:body use="literal" parts="parameters"/>
        </wsdl:input>
        <wsdl:output>
            <soap:body use="literal" parts="parameters"/>
        </wsdl:output>
    </wsdl:operation>

    <wsdl:operation name="logout">
        <soap:operation style="document" soapAction="http://soap.jrimer-amp64/"/>
        <wsdl:input>
            <soap:body use="literal" parts="parameters"/>
        </wsdl:input>
        <wsdl:output>
            <soap:body use="literal" parts="parameters"/>
        </wsdl:output>
    </wsdl:operation>

</wsdl:binding>


<wsdl:message name="versionRequest">
    <wsdl:part name="parameters" element="ns0:versionRequest"/>
</wsdl:message>


<wsdl:message name="versionResponse">
    <wsdl:part name="parameters" element="ns0:versionResponse"/>
</wsdl:message>

<wsdl:message name="loginRequest">
    <wsdl:part name="parameters" element="ns0:loginRequest"/>
</wsdl:message>


<wsdl:message name="loginResponse">
    <wsdl:part name="parameters" element="ns0:loginResponse"/>
</wsdl:message>

<wsdl:message name="logoutRequest">
    <wsdl:part name="parameters" element="ns0:logoutRequest"/>
</wsdl:message>

<wsdl:message name="logoutResponse">
    <wsdl:part name="parameters" element="ns0:logoutResponse"/>
</wsdl:message>

Мой класс функций SOAP выглядит следующим образом (включен в мой SOapServer через setClass ()):

class WebSvcSoapFunctions
{
    private $username = ''; // username provided by the client during login() request
    private $password = ''; // password provided by the client during login() request

    /**
    * Handle a login request
    * 
    * @param string $user - Client's Username
    * @param string $pass - Client's Password
    */
    public function login($user,$pass)
    {
        $this->username = $user;
        $this->password = $pass;

        // should check for validity here, but for testing, return true.
        return 'Successful Login. Welcome, '.$user;
    }

    /**
    * Logs the client out.
    * 
    */
    public function logout()
    {
        $this->username = '';
        $this->password = '';
        $_SESSION = array();
        session_destroy();
        return 'Logged Out Successfully.';
    }
        /**
    * checks if the client has logged in successfully
    * 
    * @return bool - true=logged in, false = unauthenticated
    */
    private function isAuthenticated()
    {
        if (isset($this->username) && $this->username != '')
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    /**
    * Returns the version of the SOAP Server to the requesting client
    * 
    */
    public function version()
    {
        if ($this->isAuthenticated())
        {
            return 'Affinegy Service v1.0.0';
        }
        else
        {
            return 'NOT AUTHORIZED.';
        }
    }   
}

Мой тестовый класс SOAP CLIENT выглядит следующим образом:

<code>ini_set("soap.wsdl_cache_enabled", "0");  
define('WSDL_URL','http://soap.jrimer-amp64/?wsdl');   
try
{ 
    $client = new SoapClient(WSDL_URL, array('trace'=>true));

    $request = 'version';
    $args = array();
    $SOAPResult = $client->$request($args); // call the SOAP Server's "version" function
    OutputLastRequestResponse($client, $request, $args, $SOAPResult);

    $request = 'login';
    $args['username'] = 'testuser';
    $args['password'] = '1234';
    $SOAPResult = $client->$request($args); // call the SOAP Server's "login" function
    OutputLastRequestResponse($client, $request, $args, $SOAPResult);

    $request = 'version';
    $args = array();
    $SOAPResult = $client->$request($args); // call the SOAP Server's "version" function
    OutputLastRequestResponse($client, $request, $args, $SOAPResult);

    $request = 'logout';
    $args = array();
    $SOAPResult = $client->$request($args); // call the SOAP Server's "logout" function
    OutputLastRequestResponse($client, $request, $args, $SOAPResult);

    $request = 'version';
    $SOAPResult = $client->$request($args); // call the SOAP Server's "version" function
    OutputLastRequestResponse($client, $request, $args, $SOAPResult);

}
catch (Exception $e)
{
    echo '<pre>FAILED: '.print_r($e,1).'
'; // вывести клиентское исключение на экран OutputLastRequestResponse ($ клиент); } / ** * Отображение запроса и ответа на тестовый сервисный звонок * * @param SoapServer $ client - объект типа SoapClient, который выполняет запрос * @param string $ required - имя вызываемой функции SOAP * @param array $ args - Аргументы, отправленные в функцию SOAP * @param string $ return - PHP читаемое значение, возвращаемое клиентом, вызывающим предоставленную функцию SOAP * / функция OutputLastRequestResponse ($ client, $ required = '', $ args = array (), $ return = '') { echo '

XXXXXXXX SERVICE SOAP SERVER TEST

'; echo 'Request:
'.$requested.'
'; echo 'Аргументы запроса:
'.print_r($args,1).'
'; echo 'Возвращено:
'.$returned.'
'; echo 'Raw Request:
'.htmlspecialchars($client->__getLastRequestHeaders());
    echo htmlspecialchars($client->__getLastRequest()).'
'; echo 'Raw Response:
'.htmlspecialchars($client->__getLastResponseHeaders())."\n";
    echo htmlspecialchars($client->__getLastResponse()).'
'; }

Результаты тестового прогона следующие: Уведомление «НЕ РАЗРЕШЕНО». является ответом на все, указывая, что ТОЛЬКО функция WebSvcSoapFunctions :: version () работает

Xxxxxx СЕРВИС SOAP СЕРВЕР ТЕСТ Запрос:

версия

Аргументы запроса:

Array ()

Возвращается:

НЕ РАЗРЕШЕНО.

Запрос на добавление:

POST / HTTP / 1.1 Хост: soap.jrimer-amp64 Соединение: Keep-Alive User-Agent: PHP-SOAP / 5.2.10 Content-Type: text / xml; кодировка = UTF-8 SOAPAction: "http://soap.jrimer -amp64 /" Длина контента: 227

Необработанный ответ:

HTTP / 1.1 200 OK Дата: четверг, 16 июня 2011 г. 19:43:32 GMT Сервер: Apache / 2.2.3 (CentOS) X-Powered-By: PHP / 5.2.10 Set-Cookie: PHPSESSID = scbuin269990ahfargfq7k0972; путь = / истекает: чт, 19 ноября 1981 08:52:00 GMT Cache-Control: нет магазина, без кеша, обязательна повторная проверка, post-check = 0, pre-check = 0 Прагма: Контент-длина без кэширования: 209 Подключение: закрыть Content-Type: текст / XML; кодировка = UTF-8 * * 1 055

НЕ УПОЛНОМОЧЕННЫЙ.

Xxxxxx СЕРВИС-МЫЛО ТЕСТ СЕРВЕРА Запрос:

Войти

Аргументы запроса:

Array ( [имя пользователя] => jrimer [пароль] => 1234)

Возвращается:

НЕ РАЗРЕШЕНО.

необработанный запрос:

POST / HTTP / 1.1 Хост: soap.jrimer-amp64 Соединение: Keep-Alive User-Agent: PHP-SOAP / 5.2.10 Content-Type: text / xml; кодировка = UTF-8 SOAPAction: "http://soap.jrimer -amp64 /" Контент-длина: 298 PHPSESSID = scbuin269990ahfargfq7k0972;

usernamejrimerpassword1234

Необработанный ответ:

HTTP / 1.1 200 OK Дата: четверг, 16 июня 2011 г. 19:43:32 GMT Сервер: Apache / 2.2.3 (CentOS) X-Powered-By: PHP / 5.2.10 Истекает: четверг, 19 ноября 1981 года, 08:52:00 по Гринвичу Cache-Control: без хранилища, без кэша, must-revalidate, post-check = 0, pre-check = 0 Прагма: без кешированияКонтент-длина: 209 Подключение: закрыть Content-Type: text / xml; кодировка = UTF-8

НЕ УПОЛНОМОЧЕННЫЙ.

Xxxxxx СЕРВИС-ТЕСТ SOAP-СЕРВЕР Запрос:

версия

Аргументы запроса:

Array ()

Возвращается:

НЕ УПОЛНОМОЧЕНО.

необработанный запрос:

POST / HTTP / 1.1 Хост: soap.jrimer-amp64 Соединение: Keep-Alive User-Agent: PHP-SOAP / 5.2.10 Content-Type: text / xml; кодировка = UTF-8 SOAPAction: "http://soap.jrimer -amp64 /" Контент-длина: 227 PHPSESSID = scbuin269990ahfargfq7k0972;

Необработанный ответ:

HTTP / 1.1 200 OK Дата: четверг, 16 июня 2011 г. 19:43:32 GMT Сервер: Apache / 2.2.3 (CentOS) X-Powered-By: PHP / 5.2.10 Истекает: четверг, 19 ноября 1981 года, 08:52:00 по Гринвичу Cache-Control: без хранилища, без кэша, must-revalidate, post-check = 0, pre-check = 0 Прагма: без кеширования Контент-длина: 209 Подключение: закрыть Content-Type: text / xml; кодировка = UTF-8

НЕ УПОЛНОМОЧЕННЫЙ.

Xxxxxx СЕРВИС SOAP СЕРВЕР ТЕСТ Запрос:

выход из системы

Аргументы запроса:

Array ()

Возвращается:

НЕ УПОЛНОМОЧЕНО.

необработанный запрос:

POST / HTTP / 1.1 Хост: soap.jrimer-amp64 Соединение: Keep-Alive User-Agent: PHP-SOAP / 5.2.10 Content-Type: text / xml; кодировка = UTF-8 SOAPAction: "http://soap.jrimer -amp64 /" Контент-длина: 227 PHPSESSID = scbuin269990ahfargfq7k0972;

Необработанный ответ:

HTTP / 1.1 200 OK Дата: четверг, 16 июня 2011 г. 19:43:32 GMT Сервер: Apache / 2.2.3 (CentOS) X-Powered-By: PHP / 5.2.10 Истекает: четверг, 19 ноября 1981 года, 08:52:00 по Гринвичу Cache-Control: без хранилища, без кэша, must-revalidate, post-check = 0, pre-check = 0 Прагма: без кеширования Контент-длина: 209 Подключение: закрыть Content-Type: text / xml; кодировка = UTF-8

НЕ УПОЛНОМОЧЕННЫЙ.

Xxxxxx СЕРВИС-МЫЛО ТЕСТ СЕРВЕРА Запрос:

версия

Аргументы запроса:

Array ()

Возвращается:

НЕ УПОЛНОМОЧЕНО.

необработанный запрос:

POST / HTTP / 1.1 Хост: soap.jrimer-amp64 Соединение: Keep-Alive User-Agent: PHP-SOAP / 5.2.10 Content-Type: text / xml; кодировка = UTF-8 SOAPAction: "http://soap.jrimer -amp64 /" Контент-длина: 227 PHPSESSID = scbuin269990ahfargfq7k0972;

Необработанный ответ:

HTTP / 1.1 200 OK Дата: четверг, 16 июня 2011 г. 19:43:32 GMT Сервер: Apache / 2.2.3 (CentOS) X-Powered-By: PHP / 5.2.10 Истекает: четверг, 19 ноября 1981 года, 08:52:00 по Гринвичу Cache-Control: без хранилища, без кэша, must-revalidate, post-check = 0, pre-check = 0 Прагма: без кеширования Контент-длина: 209 Подключение: закрыть Content-Type: text / xml; кодировка = UTF-8 * +1155 *

НЕ УПОЛНОМОЧЕННЫЙ.

Есть идеи, что происходит?

ПРИМЕЧАНИЕ. Я замечаю, что если я просто закомментирую определение в WSDL для функции VERSION, следующая определенная функция станет функцией «всегда вызываться» (вход в систему) ... Что я неправильно настроил в этом WSDL?

1 Ответ

0 голосов
/ 17 июня 2011

Да, это был WSDL, я его полностью неверно определил ... Реструктурировал WSDL и теперь он корректно выставляет запросы ...

...