Как использовать веб-сервис с состоянием с использованием PHP-класса SoapClient? - PullRequest
5 голосов
/ 12 января 2011

нубский вопрос.

Я занимаюсь разработкой веб-сайта PHP, который использует веб-службу с состоянием. По сути, «поток управления» моего веб-сайта следующий:

  1. Пользователю показана страница.
  2. Пользователь выполняет действие.
  3. Сервер веб-сайта выполняет запрос к веб-службе, используя пользовательский ввод в качестве параметров.
  4. Сервер веб-службы выполняет запрос и в процессе переходит из состояния A в состояние B.
  5. Сервер веб-сайта перенаправляет пользователя на другую страницу, и мы возвращаемся к шагу 1.

Моя проблема заключается в том, что веб-сайт теряет состояние веб-службы между запросами. Как заставить веб-сайт отслеживать состояние веб-службы? Я использую стандартный класс SoapClient PHP.

Я попытался сериализовать объект SoapClient в переменную сеанса:

# ws_client.php
<?php
function get_client()
{
    if (!isset($_SESSION['client']))
        $_SESSION['client'] = new SoapClient('http://mydomain/MyWS/MyWS.asmx?WSDL', 'r');
    return $_SESSION['client'];
}
function some_request($input1, $input2)
{
    $client = get_client();
    $params = new stdClass();
    $params['input1'] = $input1;
    $params['input2'] = $input2;
    return $client->SomeRequest($params)->SomeRequestResult;
}
function stateful_request($input)
{
    $client = get_client();
    $params = new stdClass();
    $params['input'] = $input;
    return $client->StatefulRequest($params)->StatefulRequestResult;
}
?>

# page1.php
<?php
session_start();
$_SESSION['A'] = some_request($_POST['input1'], $_POST['input2']);
session_write_close();
header('Location: page2.php');
?>

# page2.php
<?php
session_start();
echo $_SESSION['A']; // works correctly
echo stateful_request($_SESSION['A']); // fails
session_write_close();
?>

Но это не работает. Что не так с моим кодом?

Ответы [ 3 ]

2 голосов
/ 12 января 2011

Вам нужно будет использовать http://php.net/manual/en/soapclient.getlastresponseheaders.php для поиска заголовка «set-cookie», восстановленного сервером, а затем использовать http://php.net/manual/en/soapclient.setcookie.php для установки этого куки при отправке последующих запросов.Извините, я не могу написать пример кода, так как я не знаю PHP.

0 голосов
/ 21 января 2013

Вы также можете напрямую получить файлы cookie от мыльного клиента, открыв $ my_soapclient -> _ cookie, поэтому вам не нужно анализировать заголовок ответа вручную.

См. Здесь: Чтение инструкций Set-Cookie в заголовке HTTP-ответа

Но в руководстве php по этому поводу ничего нет.

0 голосов
/ 13 апреля 2012

Для использования веб-службы с отслеживанием состояния необходимо установить идентификатор сеанса сеанса сервера в файле cookie SOAP на стороне клиента.По умолчанию каждый раз, когда отправляется запрос SOAP, сервер генерирует уникальный идентификатор сеанса.Чтобы предотвратить это, просто установите идентификатор сеанса, полученный из первого запроса в SOAP cookie.Этот файл cookie будет отправлен вместе со всеми последующими мыльными вызовами.Например, если вы используете веб-сервис ASP.net с использованием SOAP, то после первого вызова WS получите заголовки ответа, например:

$client = SoapClient("some.wsdl", array('trace' => 1));
$result = $client->SomeFunction();
$headers = $client->__getLastResponseHeaders();

Теперь $headers должен содержать идентификатор сеанса с именем, например'ASP.NET_SessionId.Получите идентификатор из $headers и создайте файл cookie следующим образом:

//$client->__setCookie($cookieName, $cookieValue);
$client->__setCookie('ASP.NET_SessionId', $cookieValue);

Теперь все запросы SOAP от вашего клиента будут содержать этот идентификатор сеанса, и ваше состояние будет сохраняться на сервере.

...