построение тела запроса от необязательных проверок - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь смоделировать сценарий, в котором первоначальный запрос предоставит несколько разных списков идентификаторов, а затем в последующем запросе необходимо будет представить значения в этих списках (если они существуют) как часть полезной нагрузки 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()

но я не могу найти способ просто передать параметр, который получается при попытке разрешить переменную сеанса

1 Ответ

0 голосов
/ 24 апреля 2019

, поэтому я пришел к решению, которое, кажется, работает довольно хорошо - мне просто нужно было разрешить некоторые переменные сеанса в функции StringBody и построить JSON в соответствии с требованиями.

использование возможностей 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
  ))
  ...
}
...