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
相关产品推荐
相关产品推荐

