【问题标题】:How to pass session id as part of Soap request?如何将会话 ID 作为 Soap 请求的一部分传递?
【发布时间】:2014-05-31 13:40:35
【问题描述】:

我调用身份验证请求以接收会话 ID:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <loginResponse xmlns="urn:company" xmlns:ns2="urn:company">
         <result>
            <sessionId>2342422342.dc8bizxsfapi03</sessionId>
            <msUntilPwdExpiration>2342342342342353452323</msUntilPwdExpiration>
         </result>
      </loginResponse>
   </S:Body>
</S:Envelope>

在我正在使用的 Soap API 的文档中指出:

A successful login will return a
session ID as an HTTP Cookie. This cookie must be passed back to all subsequent HTTP
Requests that invoke API operations in order to authenticate.

会话 id 是如何传递给下一个 http 请求的,因为这没有描述?

我假设我需要将会话 ID 作为后续请求的一部分嵌入到 XML 标记中,但这应该在 API 中详细说明,或者是否有我可以使用的标准机制?

【问题讨论】:

  • AFAIK SOAP 在设计上是无状态的。尝试使其有状态必须是一种特定的机制,应在 API 中详细说明
  • 嗨,我可能没有正确理解这个问题,但对我来说,您似乎需要将会话 ID 提取到属性(TestCase、TestSuite 或项目)中,然后使用定义的属性。顺便说一句,这里有一个例子。
  • 由于您使用的是soapui,您可以编写一个groovy脚本将其插入到另一个请求中
  • 抱歉,忘记将提到的链接添加到示例soapui.org/Functional-Testing/…
  • 这个问题用soapui标记,还有java和spring;你想在soapui或Java代码中获得这个设置吗?如果在 Java 代码中,您使用的是什么客户端堆栈(jax-ws、cxf 等)?

标签: java spring session soap soapui


【解决方案1】:

您引用的 API 文档指出,该服务将在响应中设置一个 cookie,该响应需要在任何后续请求中设置。 Cookie 是通过 HTTP 标头而不是请求/响应的主体发送的,通常用于建立和维护会话。 Web 服务框架使用的底层 HTTP 客户端库可以很好地为您处理此问题,但由于 SOAP Web 服务被设计为无状态,您通常必须询问框架是否希望它维护会话。当您启用此功能时,它仅意味着框架会将服务器发送给它的所有 cookie 发送回服务器,这正是您的 SOAP API 文档要求您执行的操作。

要在 jax-ws 中启用此功能,您需要在 RequestContext 上将 BindingProvider.SESSION_MAINTAIN_PROPERTY 设置为 true。 This article 给出了一个例子和更多细节。

【讨论】:

    【解决方案2】:

    是的,这是一种流行的机制。

    正如 API 所述,会话密钥在 Cookie 中返回(它是一个 HTTP 标头)。响应正文中的内容只是会话密钥的重复(我希望如此)。您需要从 HTTP 标头中提取 cookie。如果您使用的是 JAX-WS,您可以使用 BindingProvider.SESSION_MAINTAIN_PROPERTY 启用会话感知:

    Hello proxy = new HelloService().getHelloPort();
    ((BindingProvider)proxy).getRequestContext().put(BindingProvider.SESSION_MAINTAIN_PROPERTY,true);
    String result = proxy.getMessage();
    System.out.println(result); 
    

    如果没有,请尝试了解如何使用您的 Web 服务框架获取和设置 HTTP 标头。

    【讨论】:

      【解决方案3】:

      您可以通过多种方式提取会话 ID。

      • 从您提供的 xml 看来,会话 ID 似乎在 xml 响应中。如果是这种情况,您可以使用 the method suggested by olyv 并从 xml 响应中提取会话 ID。

      • lakshman 建议您可以使用 groovy 解析会话 ID 来自 xml 响应。

      下面的代码可能会有所帮助。

      def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )
      def holder = groovyUtils.getXmlHolder("Properties#response")
      log.info holder.getNodeValue("//sessionId")
      log.info holder['//sessionId']
      

      这段代码及其解释是available at Are you a hot cup?博客。

      • 使用 groovy 的另一个选项是从标头中提取 cookie 并将其存储在属性中。通过创建一个名为cookie 的标头属性并将会话ID 分配给它,将在每个请求中设置此属性的值。您必须通过查看原始响应/请求来验证属性名称和值格式。

      试试这段代码

      //in script assertion
      String message_size = messageExchange.responseHeaders["session-id"] /or whatever if the cookie name
      

      def state = context.getProperty( com.eviware.soapui.model.testsuite.TestRunContext.HTTP_STATE_PROPERTY )
      
      assert state != null : "Missing HttpState.. Try to set 'Maintain HTTP session' in test case options"
      
      def cookies = state.cookies
      

      以上代码示例来自http://forum.soapui.org/viewtopic.php?t=3066#p10957

      • 最后,有一个测试用例级别的选项来维护 http 会话,如果您选择此选项,您就不必担心提取会话 ID。关于这个的soapUI指南说..

      例如,当在 TestCase 选项对话框中选择了“维护 HTTP 会话”选项时,soapUI 在内部使用它在上下文中存储一个 HttpState 对象。

      上一行的链接:http://www.soapui.org/Functional-Testing/testcase-execution.html

      【讨论】:

      • 谢谢,但我真的在寻找 java/spring 实现
      【解决方案4】:

      您所附的 API 说明指出您需要做的就是正确管理您的 cookie。

      成功的登录响应将包含带有会话 ID 的 cookie(在响应中也复制为 &lt;sessionId&gt;xxxx&lt;/sessionId&gt; 元素)。

      您所要做的就是将此 cookie 包含在对该 API 的所有后续调用中。

      根据您的 HTTP/SOAP 客户端,这些东西只需要设置,客户端只需遵循 HTTP Cookie 标准的约定,因此它接收 cookie,只要它们有效就存储它们,然后将它们与所有后续请求一起传递使用相同的 URI。

      如果您使用的是 SoapUI,只需将会话管理添加到您的测试用例中,如下图所示:

      如果这还不够,你还想掀开引擎盖看看see this blog是什么

      HTH

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-23
        • 2018-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多