【问题标题】:Base64 JAVA encode with dynamic values in SCALA - GATLING在 SCALA 中使用动态值进行 Base64 JAVA 编码 - GATLING
【发布时间】:2023-04-11 09:15:01
【问题描述】:

我正在使用 GATLING 并尝试在 scala 中使用 java 的库“Base64”来发送编码 uder:password 在标头(“授权”)请求中,具有动态值: 我正在尝试执行以下操作:

 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”却不行。

有没有办法在运行时保存值而不需要执行部分?

【问题讨论】:

  • 尝试将val finalToken 更改为def finalToken,看看是否有不同。我只是想知道在实例化类时而不是在调用它时(在设置会话变量之后)是否正在解析值。
  • 我试过了,还是不行:( @eurotrash
  • 在这种情况下,可能是您使用不正确。也许${} 语法只适用于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 可能是错误的。

标签: java scala encoding base64 gatling


【解决方案1】:

我不太了解加特林,但我认为这应该可行。它不是最漂亮的,但没有看到完整的代码以及它是如何使用的,很难想出看起来不错的东西:

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 值将被设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 2017-01-22
    相关资源
    最近更新 更多