从可选检查中构建请求正文

时间:2019-04-18 06:03:30

标签: gatling scala-gatling

我正在尝试模拟一个场景,其中初始请求将提供几个不同的Ids列表,然后一个稍后的请求需要提交这些列表中的值(如果存在)作为JSON负载的一部分。列表中的任何一个都不能保证包含在响应中,如果没有,则在以后的JSON中根本没有对应的条目。

例如,通话1可能会返回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()}"}

但是如果Ids列表中的一个为空,则根本无法在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()

但是我无法找出一种方法来传递尝试解析会话变量所产生的选项

1 个答案:

答案 0 :(得分:0)

所以我想出了一个看起来效果很好的解决方案-我只需要解析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
  ))
  ...
}