Мой 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?