web-dev-qa-db-ja.com

ガトリング-JSON配列をループする

RESTサービスの応答から取得されるJSON配列をループする必要があるコードのブロックがあります。( ここで利用可能な完全な要点 。)

.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}

私は2番目のリクエストで体が

{"playerId":"Right(empty iterator)}

予想:本文が3つのリクエスト

 {"playerId":1}
 {"playerId":2}
 {"playerId":3}

PlayerIdsだけを保存すると、結果の配列を正常にループできます。

.check(jsonPath("$.data[*].playerId").findAll.saveAs("pList")))
11
Neil

私はあなたが探しているリクエストを送信することができました(まだ404を受け取っていますが、それはサーバーサイドであるか、Gistが送信しているリクエストに何かが欠けている可能性があります)。秘訣は、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チェックはJSONオブジェクトをマップとして自動的に保存し、キーでプレーヤーIDにアクセスできます。値のタイプはAnyである必要はありません。すべての値が数値の場合は、IntまたはLongを使用できます。 JsonPathの問題点について詳しく知りたい場合は、このまま読み進めてください。


最初の問題は、JsonPath.query()が探している値を返すだけではないということです。 JsonPath readme から:

JsonPath.query( "$。a"、jsonSample)は、Right(空でないイテレータ)を提供します。これにより、クエリに対して考えられるすべてのソリューションを繰り返すことができます。

さて、それがRight(non-empty iterator)と言うとき、私はそれがイテレータが空ではなかったことを意味すると思いました。ただし、これを試してみると:

_val playerId = JsonPath.query("$.playerId", session("player").as[String]).right.get
println(playerId)
_

...「空のイテレータ」を出力します。 JsonPathjsonPathチェック、またはその間の使用法に問題があるかどうかはわかりませんが、掘り下げたいドキュメントが十分ではありません。

14
Michelle