You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala/Grpc中Protobuf消息转请求Payload的实现咨询

问题:将Protobuf请求转换为Gatling的Expression[StartPairingRequest]

折腾了好几天,终于在项目里成功集成了Grpc和Gatling插件。参考phiSgr的示例时,我看到了如何把Protobuf的GreetRequest消息转换成Scala中的Expression[GreetRequest]的实现。现在需要把以下Protobuf定义:

message Device {
   string id = 1[(google.api.field_behavior) = REQUIRED]
}
message StartPairingRequest {
   Device device = 1 [(google.api.field_behavior) = REQUIRED]
}

以及对应的请求体:

{
   "Device": {
       "id": "random text"
   }
}

转换成Scala中的Expression[StartPairingRequest],我自己写的代码有问题,求指导正确的转换流程。

我的错误尝试代码:

val greetPayload: Expression[StartPairingRequest] = StartPairingRequest(device = " "theBody" = "random text" " ).updateExpr(
_.device:~$("device")
)

正确实现流程

1. 核心逻辑

Gatling的Expression[T]本质是Session => Validation[T],作用是在运行时从Session中取数据、生成动态请求对象。对于嵌套结构的Protobuf消息,需要逐层构建对应的表达式逻辑。

2. 两种场景的正确代码

场景一:生成带随机ID的请求

如果只是需要生成带随机文本ID的请求,直接在表达式里生成随机值即可:

import io.gatling.core.session.Expression
// 导入你的Protobuf生成的Scala类,替换成实际包路径
import com.your.package.{Device, StartPairingRequest}

val startPairingPayload: Expression[StartPairingRequest] = { session =>
  // 生成随机文本ID,这里用UUID示例,也可以换其他随机逻辑
  val randomId = java.util.UUID.randomUUID().toString
  val device = Device(id = randomId)
  StartPairingRequest(device = device).success
}

场景二:从Gatling Session中读取ID

如果需要从Session中读取预先存储的device ID(比如前置步骤保存的变量),可以用两种写法:

// 写法一:用updateExpr修改基础对象字段
val startPairingPayload: Expression[StartPairingRequest] = 
  StartPairingRequest(device = Device(id = "占位符"))
    .updateExpr(_.device.id :~ $("deviceId"))

// 写法二:直接从Session提取变量构建请求
val startPairingPayload: Expression[StartPairingRequest] = 
  $("deviceId").map { id =>
    StartPairingRequest(device = Device(id = id))
  }

3. 代码说明

  • 场景一的写法适合不依赖Session数据的独立请求生成,直接在表达式内完成随机值生成和对象组装。
  • 场景二的两种写法都是利用Gatling的$("key")语法从Session中提取变量,再嵌套构建Protobuf对象;updateExpr是Protobuf DSL提供的便捷语法,用于对已初始化的基础对象做动态字段修改。

内容的提问来源于stack exchange,提问作者TriNguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 09:39:59