如何解决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()); }
关键要点
- 采样器类型区分:通过
instanceof判断当前采样器的具体类型,针对HTTP和不同WebSocket采样器调用对应API - WebSocket请求体获取:JMeter所有WebSocket采样器(Request-Response、Single Write)都通过
getPayload()方法获取请求体 - 修复原代码错误:你原代码存在两处语法问题:
getArgumens拼写错误(应为getArguments)、log.info语句缺少闭合括号,这些都在修正代码中解决
内容的提问来源于stack exchange,提问作者K Rana
相关产品推荐
相关产品推荐

