Gatling中JSON Feeder数据无法在gRPC请求setPhone中生效
问题解决:Gatling gRPC payload中Feeder数据无法注入
问题原因
你遇到的核心问题是:SearchRequest.newBuilder()这类构建逻辑是在Gatling场景初始化阶段执行的,此时还没有生成虚拟用户的会话(Session),直接写字符串字面量"${user_phone_number}"只会原样传入setPhone方法,Gatling的EL表达式不会被自动解析。而后续exec步骤中的代码是在运行时(每个虚拟用户请求阶段)执行的,所以能正常从session中读取到值。
解决方案:运行时从Session动态取值
要在gRPC payload构建中获取Feeder数据,需要将payload定义为一个Expression[SearchRequest](即接收Session参数并返回SearchRequest的函数),这样就能在运行时从当前用户的session中提取数据。
修改后的代码如下:
val jsonFeeder = jsonFile("data.json").random val request: ChainBuilder = { feed(jsonFeeder).exec( grpc("RequestType") .rpc(API.getSearchMethod) // 将payload改为接收Session的函数,动态获取值 .payload(session => SearchRequest.newBuilder() .setSearchCriteria(SearchCriteria.newBuilder() .setUserData(UserDataCriteria.newBuilder() .setPhone(session("user_phone_number").as[String]) .build()) .build()) .build() ) .extract(_.getList.some)(_ exists) .extract(_.getCount.some)(_ saveAs "Count") ) } scenario("search for owner personal info phone number") .exec(request) .exec { session => println(session("user_phone_number").as[String]) session }
补充说明
- Gatling的EL表达式
${xxx}仅在Gatling内置的支持EL解析的上下文(如HTTP请求的body、header参数、模板文件等)中生效,直接在Java/Kotlin的对象构建器中写字符串字面量不会触发解析。 - 如果你的gRPC payload结构复杂,也可以考虑将其定义为ProtoBuf对应的JSON模板文件,然后使用
ElFileBody加载并解析,但函数式的方式更直接灵活,适合简单场景。
内容的提问来源于stack exchange,提问作者Yaroslav Kravchuk
相关产品推荐
相关产品推荐

