Я пытаюсь смоделировать сценарий, в котором первоначальный запрос предоставит несколько разных списков идентификаторов, а затем в последующем запросе необходимо будет представить значения в этих списках (если они существуют) как часть полезной нагрузки JSON. Ни один из списков не гарантированно присутствует в ответе, и если это не так, то в последующем JSON для него вообще нет соответствующей записи.
Например, вызов 1 может вернуть 3 разных списка идентификаторов, которые можно сохранить для последующих вызовов ...
.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()}"}
но если один из списков идентификаторов пуст, то он вообще не может быть отправлен в JSON, т. Е. Если в первом запросе не было временных идентификаторов, то полезная нагрузка JSON должна выглядеть как
{"managers":"${managerIds.jsonStringify()}",
"employees":"${employeeIds.jsonStringify()}"}
Я мог бы заставить это работать, используя transformOption для проверки, чтобы установить переменную сеанса в пустой список, а затем получить условное построение полезной нагрузки JSON, выполнив что-то вроде
jsonPath("$..temp").findAll.transformOption(ids => ids.orElse(Some(Seq.empty[String])).success).saveAs("tempIds"))
но я надеялся на что-то более идиоматическое scala, используя Options.
Я могу сгенерировать необходимый 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()
но я не могу найти способ просто передать параметр, который получается при попытке разрешить переменную сеанса