加特林:如何从数组中提取一个对象?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加特林:如何从数组中提取一个对象?相关的知识,希望对你有一定的参考价值。

我是Gatling和Scala的新手。发送Get Request的响应主体是Array,我只需要从Array中提取一个对象并将其发布到Gatling中。有人可以向我解释如何做吗?

这是我的代码示例:

private val getUsers = exec(
      http("Get users")
        .get("/users")
        .check(status.is(200))
        .check(bodyString.saveAs("Users")))

我得到的结果是:

["id":"1","hairColor":"BROWN","age":24,"language":"English","birthDate":"1995-02-10",
"id":"2","hairColor":"YELLOW","age":30,"language":"Australian","birthDate":"1889-10-05",
"id":"3","hairColor":"BLACK","age":15,"language":"American","birthDate":"...",
"id":"4","hairColor":"RED","age":50,"language":"Russian","birthDate":"..."]

如何从此数组中仅获取一个用户并发布整个User对象?

答案

您可以轻松获得,但需要定义哪个键

它通过键使用'id'的示例

$.[*].[?(@.id == '1')]


$.[*] <=获取数组的所有元素

.[?(@.id == '1')] <=获取ID等于“ 1”的元素(可以使用任何值)。

或任何键$.[*].[?(@.hairColor == 'BROWN')]


然后添加.check(jsonPath("$.[*].[?(@.id == '1')]").saveAs("myUser")

另一答案

我自己找到了答案。如果我想保存数组中的任何一个对象,我可以这样做->

private val getUsers = exec(
  http("Get users")
    .get("/users")
    .check(status.is(200))
    .check(jsonPath("$[0]").find.saveAs("user")))

当然,我必须指定要保存的值,但是在我的示例中,我要保存第一个值。之后,您可以将此值用于其他请求。

另一答案

如果切换到jsonPath检查,则可以将所有用户对象放入一个Vector,在Gatling EL中有很好的支持

所以代替

.check(bodyString.saveAs("Users"))

您可以使用

.check(jsonPath("$..[?(@.id)]").findAll.saveAs("Users")))

然后,当您进行后续通话时,您可以执行类似的操作

选择第一个用户

.body(StringBody("$Body(1).jsonStringify()"))

选择一个随机用户

.body(StringBody("$Body.random().jsonStringify()"))

此方法还将允许您使用.forEach插入所有记录

以上是关于加特林:如何从数组中提取一个对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何从一个对象数组中提取所有可能匹配的对象数组?

加特林 HTML 响应

如何从 React 中的嵌套对象数组中提取数据?

如何从另一个数组中的 JSON 对象中提取值?

如何从数组中的对象的某些键中提取值

为啥加特林不将身份验证令牌从 POST 返回正文发布到 GET 标头