使用UUID.randomUUID().toString在请求正文中设置密钥,给出问题-scala

使用UUID.randomUUID().toString在请求正文中设置密钥,给出问题-scala,scala,gatling,Scala,Gatling,我不熟悉使用scala和gatling。我正在定义一个场景,该场景执行http post调用来创建资源。在请求主体的一个键/字段中,我想为名称添加一个唯一标识符,因此使用UUID.randomUUID(),但是当使用以下代码时,请求失败 val uuid = UUID.randomUUID().toString println(uuid) val scn = scenario("Testing !") .exec(http("create resource")

我不熟悉使用scala和gatling。我正在定义一个场景,该场景执行http post调用来创建资源。在请求主体的一个键/字段中,我想为名称添加一个唯一标识符,因此使用UUID.randomUUID(),但是当使用以下代码时,请求失败

val uuid = UUID.randomUUID().toString
println(uuid)

val scn = scenario("Testing !")
    .exec(http("create resource")
                .post("/data")
                .body(StringBody(
                """{
                   "add_name": "${uuid}",
                }""")).asJSON
                .check(status is(200)))
尽管打印uuid确实会在控制台中打印id,但会在post请求主体上抛出错误,因为我认为“${uuid}”可能是错误的,但我不确定


非常感谢任何建议/帮助

您正在混淆gatling的内部表达式替换和scala的字符串插值

许多gatling DSL方法将允许您在字符串中使用像“${uuid}”这样的标记-当出现这种情况时,gatling实际上获取会话值“uuid”并将其替换为字符串。但这只适用于会话中存在的密钥。如果它们不存在,gatling将只使用${uuid}作为字符串文本

Scala支持使用
s“$uuid”
进行字符串插值。在本例中,它将构建一个具有scala变量“uuid”值的字符串

在您的例子中,您有一个“uuid”变量,但您没有将其放入gatling会话中。您可以将scala变量与scala字符串插值语法一起使用,但这并不会给您预期的结果,因为所有gatling dsl方法都定义了在启动时执行的构建器—所有uuid都将具有相同的值

您需要做的是构建一个生成随机uuid的feeder,然后使用gatlingfeeder构造在每次执行中获得唯一的值

private val uuidFeeder = Iterator.continually(Map("uuid" -> UUID.randomUUID().toString))

val scn = scenario("Testing !")
.feed(uuidFeeder) //this gets the next random uuid and puts it in the session
.exec(http("create resource")
            .post("/data")
            .body(StringBody(
            """{
               "add_name": "${uuid}",
            }""")).asJSON
            .check(status is(200)))

我想你错过了三重引号(
)之前的
s
)这将启用字符串插值,允许在字符串中插入变量。实际上,我在其他http请求中也采用了相同的方法,其中id来自以前的http响应,但它们似乎仅通过使用“${id}”来获取var的值“,已将
s
放在引号之前,并且它可以处理所有其他请求。没有
s
,它不应该工作。”。如果这只是一个普通的字符串,您应该检查一切是否如您所期望的那样工作……非常棒的解决方案和解释。谢谢