在SCALA-GATLING中使用动态值进行Base64 JAVA编码

在SCALA-GATLING中使用动态值进行Base64 JAVA编码,java,scala,encoding,base64,gatling,Java,Scala,Encoding,Base64,Gatling,我正在使用GATLING,并试图在scala中的java库“Base64”中使用它来发送头中的encode uder:password(“authorization”)请求,其中包含动态值: 我正努力做到以下几点: val register = { exec(request.asJSON .check(status.is(200)) .check(jsonPath("$..user").saveAs("user")) .check(jsonPath(

我正在使用GATLING,并试图在scala中的java库“Base64”中使用它来发送头中的encode uder:password(“authorization”)请求,其中包含动态值: 我正努力做到以下几点:

 val register = {
    exec(request.asJSON
      .check(status.is(200))
      .check(jsonPath("$..user").saveAs("user"))
      .check(jsonPath("$..password").saveAs("password"))
    ).pause(1)
  }


      val myvalue: HttpRequestBuilder = Utils.createPostFormParamsRequest(
        "myvalue",
        login,
        Map("value"-> ("Basic " + Base64.getEncoder.encodeToString((("${user}").getBytes() + ":" + ("${password}").getBytes()).getBytes("utf-8")))),
        Map())
我还尝试了
Base64.getEncoder.encodeToString((“${uesr}”+”:“+”${password}”).getBytes(“utf-8”))

但Base64似乎采用字符串
“${user}”
,而不是实际值,因此加密无法正常工作

我试着:

val helper = {
  exec { session =>
  val user : String= (session("user").as[String])
  val password : String= (session("password").as[String])

  val  temp = "Basic " + Base64.getEncoder.encodeToString((user + ":" + password).getBytes("utf-8"))
  val temp2: HttpRequestBuilder = Utils.createPostFormParamsRequest(
  "bla",
  login,
  Map("value"-> temp),
  Map())

  val assert = {
  exec(helper.asJSON
  .check(status.is(200))
  .check(header("answer").saveAs("answer"))
  ).pause(1)
}
  session
}
在这里,加密可以正常工作,但“exec”不能


有一种方法可以在运行时保存值,而不需要部分exec?

我对Gatling不太了解,但我认为这应该是可行的。它不是最漂亮的,但是如果没有看到完整的代码和它的使用方法,就有点难想出好看的东西:

var token: String = null
val registerAssert = exec(...)
def finalToken = {
    Utils.createPostFormParamsRequest(
        "Final token",
        Constants.LOGIN,
        Map("Authorization"-> token),
        Map())
}
def saveToken(s: Session) = {
    token = "Basic " + Base64.getEncoder.encodeToString((s("uuid").as[String].getBytes() + ":" + s("secret").as[String].getBytes()).getBytes("utf-8")
    s
}

// now you're actually executing the above

scenario(...)
.exec(registerAssert)
.exec(saveToken(_))
.exec(finalToken) // I'm assuming finalToken is executable

这样做的目的是首先将令牌值保存在类变量中,然后仅构造
finalToken
请求(使用该令牌)。因此,
def
,当它被调用时,
token
值将被设置。

尝试将
val finalToken
更改为
def finalToken
,看看是否有区别。我只是想知道,在实例化类时,而不是在调用类时(在设置会话变量之后),是否正在解析该值。我尝试过,但仍然不起作用:(@eurotrashIn在这种情况下,可能是您使用它不正确。可能是
${}
语法只在
exec
中有效。您必须检查有关该语法的文档。我将发布一个可能的替代解决方案的答案。它不仅在exec中有效,因为我做了以下操作:
val registerReq:HttpRequestBuilder=Utils.createPostBodyRequest(“Register”),Constants.REGISTER_API_V3,Map(“Content Type”->“application/json”,“Authorization”->“${lihitoken}”),ElFileBody(“ProtectorRegistrationDTO.json”)
并且它的工作方式是
getBytes()
而不是
getBytes(System.getProperty(“file.encoding”)
因此依赖于平台,对于UTF-8可能是错误的。