Gatling - цикл по массиву JSON
У меня есть блок кода, который должен пройти через массив JSON, который получен из ответа службы REST. ( Полная суть доступна здесь.)
.exec(http("Request_1")
.post("/endPoint")
.headers(headers_1)
.body(StringBody("""REQUEST_BODY""")).asJSON
.check(jsonPath("$.result").is("SUCCESS"))
.check(jsonPath("$.data[*]").findAll.saveAs("pList")))
.exec(session => {
println(session)
session
})
.foreach("${pList}", "player"){
exec(session => {
val playerId = JsonPath.query("$.playerId", "${player}")
session.set("playerId", playerId)
})
.exec(http("Request_1")
.post("/endPoint")
.headers(headers_1)
.body(StringBody("""{"playerId":"${playerId}"}""")).asJSON
.check(jsonPath("$.result").is("SUCCESS")))
}
Формат ответа на первый запрос был
{
"result": "SUCCESS",
"data": [
{
"playerId": 2
},
{
"playerId": 3
},
{
"playerId": 4
}
]
}
А также playerId
появляется в сессии как
pList -> Vector({playerId=2, score=200}, {playerId=3, score=200}
Я вижу во втором запросе тело
{"playerId":"Right(empty iterator)}
Ожидаемый: 3 запроса с телом как
{"playerId":1}
{"playerId":2}
{"playerId":3}
Я могу успешно перебрать полученный массив, если сохраню только playerIds:
.check(jsonPath("$.data[*].playerId").findAll.saveAs("pList")))
1 ответ
Мне удалось получить запросы, которые вы ищете, отправленные (хотя по-прежнему получать 404, но это может быть на стороне сервера или запрос, который отправляет ваша сущность, может что-то пропустить). Хитрость заключалась в том, чтобы полностью отказаться от JsonPath:
.exec(http("Request_10")
.get("gatling1")
.headers(headers_10)
.check(jsonPath("$.result").is("SUCCESS"),
jsonPath("$.data[*]").ofType[Map[String,Any]].findAll.saveAs("pList")))
.foreach("${pList}", "player") {
exec(session => {
val playerMap = session("player").as[Map[String,Any]]
val playerId = playerMap("playerId")
session.set("playerId", playerId)
})
Здесь jsonPath
check может автоматически сохранить ваш объект JSON в виде карты, а затем вы можете получить доступ к идентификатору игрока по ключу. Тип значения не должен быть Any
Вы могли бы использовать Int
или же Long
если все ваши значения являются числами. Если вы хотите больше информации о том, что пошло не так с JsonPath
, читать дальше.
Ваша первая проблема в том, что JsonPath.query()
не просто возвращает значение, которое вы ищете. Из readme JsonPath:
JsonPath.query ("$. A", jsonSample) дает вам право (непустой итератор). Это позволит вам перебирать все возможные решения запроса.
Теперь, когда это говорит Right(non-empty iterator)
Я предположил, что это означает, что итератор не был пустым. Однако, если вы попробуете это:
val playerId = JsonPath.query("$.playerId", session("player").as[String]).right.get
println(playerId)
... он печатает "пустой итератор". Я не уверен, что это проблема с JsonPath
, jsonPath
проверка или использование где-то посередине, но для меня недостаточно документации, чтобы захотеть в нее разобраться.