这是有关加特林3.3版的问题
我想从json响应中保存一些键并将它们连接起来,以便可以在下一个请求的正文中重用它们。 我从get请求中从服务器获得的内容是:
{
"result": [{
"label": "Work",
"addr1": "212 Stephenville St",
"addr2": "",
"city": "Massena",
"zip": "13668",
"country": "US",
"region": "US-NY",
"additionalInfo": "",
"building": "",
"floor": "",
"room": "",
"phone": ""
}
]
}
我需要具有的变量是addr1 + zip + region + country,这意味着: “ 212 Stephenville St” +“” +“ 13668” +“” +“ US-NY” +“” +“ US”
这就是我想要做的:
var address0: String = " "
def getAddresses() = {
exec(http("GET /addresses")
.get("/addresses")
.check(status.is(200))
.transformResponse {
(session, response) =>
if(response.status.code == 200) {
val jsonResponse: JsValue = Json.parse(response.body.string)
address0 = (jsonResponse \ "result" \ 0 \ "addr1").as[String] + (jsonResponse \ "result" \ 0 \ "zip").as[String] + (jsonResponse \ "result" \ 0 \ "region").as[String] + (jsonResponse \ "result" \ 0 \ "country").as[String]
session.set("address1", address0)
response
} else {
response
}
})
.pause(1)
.exec {session => println(session); session}
}
我已经确认transformResponse块内的address0具有我需要的值,但在外面不可用。我还尝试了session.set(“ address1”,address0),以为它可以添加一个新属性,但在执行println(session)时不存在。
我想知道是否有人可以提供有关如何在此块之外提供address0值的帮助,以便我可以在下一个请求中重用它?
通过我知道的方式,我可以执行以下操作,并且可以正常工作。
def getAddresses() = {
exec(http("GET /addresses")
.get("/addresses")
.check(status.is(200))
.check(jsonPath("$.result[0].addr1").saveAs("addr1"))
.check(jsonPath("$.result[0].zip").saveAs("zip"))
.check(jsonPath("$.result[0].region").saveAs("region"))
.check(jsonPath("$.result[0].country").saveAs("country")))
.pause(1)
.exec {session => println(session); session}
}
但我希望在可能的情况下在transformResponse块中进行操作
谢谢。
答案 0 :(得分:1)
您也许可以使用transformResponse来做到这一点,但是我不确定这是最好的方法。在您的示例中出现的问题是transformResponse用于在运行检查之前修改响应-它获取响应和会话,然后返回响应。由于会话是不可变的,因此无法在块内编辑会话。
因此,您需要做的是将响应解析为JSON(如您所做的那样),然后将新构造的地址重新添加到响应中,并在通过检查调用将值输入会话之前返回它。
更容易的是通过检查来获取所有组件值,然后将它们组合成所需的组合,然后将其存储到会话中-在会话函数中或作为检查转换的一部分。这样,您根本无需弄乱任何自定义JSON解析/构造。
def getAddresses() = {
exec(http("GET /addresses")
.get("/addresses")
.check(status.is(200))
.check(jsonPath("$.result[0].addr1").saveAs("addr1"))
.check(jsonPath("$.result[0].zip").saveAs("zip"))
.check(jsonPath("$.result[0].region").saveAs("region"))
.check(jsonPath("$.result[0].country").saveAs("country"))
)
.exec(session => session.set("address", session.get("addr1").as[String] + session.get("zip").as[String] + session.get("region").as[String] + session.get("country").as[String]))