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

如何解决JMeter中BeanShell监听器无法捕获WebSocket请求体的问题

解决JMeter BeanShell监听器捕获WebSocket请求体的问题

你的代码仅适配HTTP请求,因为WebSocket采样器的API逻辑和HTTP采样器完全不同,无法直接用getArguments()方法获取请求体。以下是同时支持HTTP和WebSocket请求的修正方案:

修正后的BeanShell代码

// 获取当前采样器实例
Object sampler = ctx.getCurrentSampler();
String requestBody = "";

// 处理HTTP请求采样器
if (sampler instanceof org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy) {
    org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy httpSampler = (org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy) sampler;
    requestBody = httpSampler.getArguments().getArgument(0).getValue();
}
// 处理WebSocket Request-Response采样器
else if (sampler instanceof org.apache.jmeter.protocol.ws.sampler.WebSocketRequestResponseSampler) {
    org.apache.jmeter.protocol.ws.sampler.WebSocketRequestResponseSampler wsSampler = (org.apache.jmeter.protocol.ws.sampler.WebSocketRequestResponseSampler) sampler;
    requestBody = wsSampler.getPayload();
}
// 处理WebSocket Single Write采样器
else if (sampler instanceof org.apache.jmeter.protocol.ws.sampler.WebSocketSampler) {
    org.apache.jmeter.protocol.ws.sampler.WebSocketSampler wsSingleSampler = (org.apache.jmeter.protocol.ws.sampler.WebSocketSampler) sampler;
    requestBody = wsSingleSampler.getPayload();
}

// 输出请求体到日志
if (!requestBody.isEmpty()) {
    log.info("Request message: " + requestBody);
} else {
    log.warn("无法捕获请求体,采样器类型:" + sampler.getClass().getSimpleName());
}

关键要点

  1. 采样器类型区分:通过instanceof判断当前采样器的具体类型,针对HTTP和不同WebSocket采样器调用对应API
  2. WebSocket请求体获取:JMeter所有WebSocket采样器(Request-Response、Single Write)都通过getPayload()方法获取请求体
  3. 修复原代码错误:你原代码存在两处语法问题:getArgumens拼写错误(应为getArguments)、log.info语句缺少闭合括号,这些都在修正代码中解决

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:17:32