从可选检查构建请求正文
building request body from optional checks
我正在尝试模拟一个场景,其中初始请求将提供几个不同的 ID 列表,然后稍后的请求需要提交这些列表中的值(如果它们存在)作为它的一部分 JSON 有效载荷。 None 个列表保证在响应中,如果不是,则在后面的 JSON.
中根本没有对应的条目
例如,调用 1 可能 return 3 个不同的 ID 列表可以保存以供以后调用...
.check(
jsonPath("$..manager").findAll.optional.saveAs("managemerIds"),
jsonPath("$..employee").findAll.optional.saveAs("employeeIds"),
jsonPath("$..temp").findAll.optional.saveAs("tempIds")
)
稍后我需要将这些作为请求正文提交,格式如下
{"managers":"${managerIds.jsonStringify()}",
"employees":"${employeeIds.jsonStringify()}",
"temps":"${tempIds.jsonStringify()}"}
但如果其中一个 ID 列表为空,则根本无法在 JSON 中提交 - 即:如果第一个请求中没有 tempId,则 JSON 负载需要看起来像
{"managers":"${managerIds.jsonStringify()}",
"employees":"${employeeIds.jsonStringify()}"}
我可以通过在检查中使用 transformOption 将会话变量设置为空列表,然后通过执行
之类的操作来有条件地构建 JSON 有效负载,从而使此工作正常进行
jsonPath("$..temp").findAll.transformOption(ids => ids.orElse(Some(Seq.empty[String])).success).saveAs("tempIds"))
但我希望使用 Options 获得更多 scala 惯用的东西。
我可以通过这种方式为正文生成所需的 JSON,例如
private def createPayload(
managers: Option[String] = None,
employees: Option[String] = None,
temps: Option[String] = None) : String = {
Map("managers" -> managers,
"employees" -> employees,
"temps" -> temps
).foldLeft(JsObject.empty){ case (result, (key, values)) => {
values match {
case Some(ids) => result ++ result.transform((__ \ key).json.put(JsString(ids))).get
case None => result
}
}}.toString()
但我想不出一种方法来传递尝试解析会话变量所产生的选项
所以我想出了一个似乎工作得很好的解决方案 - 我只需要解析 StringBody 函数中的一些会话变量并根据要求构建 JSON。
使用 play 框架的 JSON 功能可能有点矫枉过正
def contactPeople(managers: Expression[Seq[String]], employees: Expression[Seq[String]], temps: Expression[Seq[String]]: ChainBuilder = {
exec(http(...)
.post(...)
.headers(...)
.body(StringBody(session =>
Map("managers" -> managers, "employees" -> employees, "temps" -> temps)
.foldLeft(JsObject.empty){ case (result, (key, values)) => {
values.apply(session) match {
case Success(ids) => result ++ result.transform((__ \ key).json.put(Json.toJson[Seq[String]](ids))).get
case Failure(error) => result
}
}}.toString
))
...
}
我正在尝试模拟一个场景,其中初始请求将提供几个不同的 ID 列表,然后稍后的请求需要提交这些列表中的值(如果它们存在)作为它的一部分 JSON 有效载荷。 None 个列表保证在响应中,如果不是,则在后面的 JSON.
中根本没有对应的条目例如,调用 1 可能 return 3 个不同的 ID 列表可以保存以供以后调用...
.check(
jsonPath("$..manager").findAll.optional.saveAs("managemerIds"),
jsonPath("$..employee").findAll.optional.saveAs("employeeIds"),
jsonPath("$..temp").findAll.optional.saveAs("tempIds")
)
稍后我需要将这些作为请求正文提交,格式如下
{"managers":"${managerIds.jsonStringify()}",
"employees":"${employeeIds.jsonStringify()}",
"temps":"${tempIds.jsonStringify()}"}
但如果其中一个 ID 列表为空,则根本无法在 JSON 中提交 - 即:如果第一个请求中没有 tempId,则 JSON 负载需要看起来像
{"managers":"${managerIds.jsonStringify()}",
"employees":"${employeeIds.jsonStringify()}"}
我可以通过在检查中使用 transformOption 将会话变量设置为空列表,然后通过执行
之类的操作来有条件地构建 JSON 有效负载,从而使此工作正常进行jsonPath("$..temp").findAll.transformOption(ids => ids.orElse(Some(Seq.empty[String])).success).saveAs("tempIds"))
但我希望使用 Options 获得更多 scala 惯用的东西。
我可以通过这种方式为正文生成所需的 JSON,例如
private def createPayload(
managers: Option[String] = None,
employees: Option[String] = None,
temps: Option[String] = None) : String = {
Map("managers" -> managers,
"employees" -> employees,
"temps" -> temps
).foldLeft(JsObject.empty){ case (result, (key, values)) => {
values match {
case Some(ids) => result ++ result.transform((__ \ key).json.put(JsString(ids))).get
case None => result
}
}}.toString()
但我想不出一种方法来传递尝试解析会话变量所产生的选项
所以我想出了一个似乎工作得很好的解决方案 - 我只需要解析 StringBody 函数中的一些会话变量并根据要求构建 JSON。
使用 play 框架的 JSON 功能可能有点矫枉过正
def contactPeople(managers: Expression[Seq[String]], employees: Expression[Seq[String]], temps: Expression[Seq[String]]: ChainBuilder = {
exec(http(...)
.post(...)
.headers(...)
.body(StringBody(session =>
Map("managers" -> managers, "employees" -> employees, "temps" -> temps)
.foldLeft(JsObject.empty){ case (result, (key, values)) => {
values.apply(session) match {
case Success(ids) => result ++ result.transform((__ \ key).json.put(Json.toJson[Seq[String]](ids))).get
case Failure(error) => result
}
}}.toString
))
...
}