如何使用PHP';SOAPS客户端类?

如何使用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对象序列化为会话变量: #

诺布问题

我正在开发一个使用有状态Web服务的PHP网站。基本上,我的网站的“控制流程”如下:

  • 向用户显示一个页面
  • 用户执行一个操作
  • 网站的服务器使用用户输入作为参数,向Web服务发出请求
  • Web服务的服务器执行请求,并在过程中从状态A转到状态B
  • 网站的服务器将用户重定向到另一个页面,我们返回到步骤1
  • 我的问题是,Web站点在请求之间失去了对Web服务状态的跟踪。如何使网站跟踪Web服务的状态?我正在使用PHP的标准
    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手册中没有关于这方面的内容