如何使用PHP';SOAPS客户端类?
诺布问题 我正在开发一个使用有状态Web服务的PHP网站。基本上,我的网站的“控制流程”如下:如何使用PHP';SOAPS客户端类?,php,web-services,session,soap-client,Php,Web Services,Session,Soap Client,诺布问题 我正在开发一个使用有状态Web服务的PHP网站。基本上,我的网站的“控制流程”如下: 向用户显示一个页面 用户执行一个操作 网站的服务器使用用户输入作为参数,向Web服务发出请求 Web服务的服务器执行请求,并在过程中从状态A转到状态B 网站的服务器将用户重定向到另一个页面,我们返回到步骤1 我的问题是,Web站点在请求之间失去了对Web服务状态的跟踪。如何使网站跟踪Web服务的状态?我正在使用PHP的标准SoapClient类 我已尝试将SoapClient对象序列化为会话变量: #
SoapClient
类
我已尝试将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();
?>
#ws#u client.php
#page1.php
#page2.php
但它不起作用。我的代码怎么了?您需要使用
要查找服务器返回的“set cookie”头,然后使用
在发送后续请求时设置cookie。
很抱歉,无法编写示例代码,因为我不懂任何PHP。要使用有状态web服务,需要在客户端的SOAP cookie中设置服务器会话的会话ID。默认情况下,每次发送SOAP请求时,服务器都会生成一个唯一的会话ID。为了防止出现这种情况,只需在SOAP cookie中设置从第一个请求获得的会话ID。该cookie将与所有后续soap调用一起发送。 例如,如果您正在使用SOAP使用ASP.net Web服务,则在第一次WS调用后,获得如下响应头:
$client = SoapClient("some.wsdl", array('trace' => 1));
$result = $client->SomeFunction();
$headers = $client->__getLastResponseHeaders();
现在,$headers
必须包含具有类似“ASP.NET\U SessionId”名称的会话ID。从$headers
中获取ID,并按如下方式创建cookie:
//$client->__setCookie($cookieName, $cookieValue);
$client->__setCookie('ASP.NET_SessionId', $cookieValue);
现在,来自客户端的所有SOAP请求都将包含此会话ID,并且您的状态将保留在服务器上。您还可以通过访问$my_soapclient->\u cookies直接从SOAP客户端获取cookie,因此您不必手动解析响应头 请看这里: 但是php手册中没有关于这方面的内容