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 проверка или использование где-то посередине, но для меня недостаточно документации, чтобы захотеть в нее разобраться.

Другие вопросы по тегам