如何从 Citrus HttpRequest 中提取 sessionId

How to extract sessionId from Citrus HttpRequest

我尝试使用 Citrus Java DSL 测试一组 REST 服务。身份验证后,服务期望第一个请求的相同有效 session id。 在服务器端我可以看到,存在一个随机 session-id,但在第二个请求中,session-id 为空。 我尝试在端点配置中将 handleCookies 设置为 true 并尝试提取一些 header 信息 (set-cookie) 但没有成功。 EndpointConfiguration 在不同的请求中重复使用。

CitrusEndpoints.http()
   .client()
   .handleCookies(true)

如何强制端点重用协商的 session-id 或者如何从请求/响应中提取它?

提前感谢您的任何想法和提示。

对您的第一个请求的响应应该有一个 header 集

Set-Cookie: JSESSIONID=ABCDEFG;path=/api/foo

您可以在接收操作中提取此信息

http()
    .client(todoClient)
    .receive()
    .response(HttpStatus.OK)
    .extractFromHeader("Set-Cookie", "cookie")
    .payload("{ \"foo\": \"bar\" }");

之后我们必须 post 处理新的 ${cookie} 值,以便将实际的 session id 名称和值提取到新变量 ${sessionId} 中。

createVariable("sessionId", "citrus:substringBefore(${cookie}, ';')");

现在我们有一个变量 ${sessionId},它只包含 session id 的名称和值 - 在我们的示例中是 JSESSIONID=ABCDEFG

在进一步的请求中,您可以使用变量来设置正确的 Cookie header 信息

http()
    .client(todoClient)
    .send()
    .get("/api/foo")
    .header("Cookie", "${sessionId}")
    .accept(ContentType.APPLICATION_JSON.getMimeType());