You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gatling Kotlin技术问询:从首个请求响应提取值复用至后续请求

问题分析与解决方案

你的代码核心问题出在第二个接口的请求体构建上:${session.get("valueToExtract")}这种写法完全错误——这里的session变量在当前字符串模板的上下文里根本不存在,而且Gatling的请求体字符串模板是编译时生成的,没法直接访问运行时的Session数据。

你中间处理Session的逻辑是正确的,截取字符串后存回Session的步骤没问题。下面是修正后的完整代码:

方案1:使用Gatling EL表达式

直接在请求体里用${valueToExtract}引用Session中的变量,这是Gatling最常用的方式:

exec(
    http("Start")
        .post("/start")
        .body(StringBody("""
            {
                "someKey": "someValue"
            }
        """.trimIndent()))
        .check(jsonPath("$.valueToExtract").find().saveAs("valueToExtract"))
)
.exec { session ->
    val extracted = session.getString("valueToExtract")
    // 截取前5个字符之后的内容
    val processedValue = extracted.substring(5)
    session.set("valueToExtract", processedValue)
}
.pause(1)
.exec(
    http("Second endpoint")
        .put("/v1/endpoint-two")
        .header("Content-Type", "application/json")
        .body(StringBody("""
            {
                "extractedValue": "${'$'}valueToExtract"
            }
        """.trimIndent()))
)

注意:Kotlin里要在字符串模板中输出$符号,需要用${'$'}转义,这样Gatling才能识别后面的EL表达式。

方案2:使用函数式请求体构建

如果需要更复杂的逻辑(比如额外的参数处理),可以用接收Session参数的lambda来构建请求体:

exec(
    http("Start")
        .post("/start")
        .body(StringBody("""
            {
                "someKey": "someValue"
            }
        """.trimIndent()))
        .check(jsonPath("$.valueToExtract").find().saveAs("valueToExtract"))
)
.exec { session ->
    val extracted = session.getString("valueToExtract")
    val processedValue = extracted.substring(5)
    session.set("valueToExtract", processedValue)
}
.pause(1)
.exec(
    http("Second endpoint")
        .put("/v1/endpoint-two")
        .header("Content-Type", "application/json")
        .body(StringBody { session ->
            """
            {
                "extractedValue": "${session.getString("valueToExtract")}"
            }
            """.trimIndent()
        })
)

这种方式直接在lambda里访问Session,不需要转义$,适合需要动态生成复杂请求体的场景。

额外提示

  • 如果你担心Session中没有valueToExtract会报错,可以用session.getOptional("valueToExtract")来做非空判断,避免运行时异常。
  • 处理Session的exec块里,必须返回修改后的Session对象(你的原代码已经做到了,这点是对的)。

内容的提问来源于stack exchange,提问作者Panos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 09:41:32