JMeter 2.13中用BSF Sampler(JavaScript)发HTTP Post请求失败求助
在JMeter 2.13的BSF Sampler(JavaScript)中调用HTTP Post请求报错的解决方法
嗨,我来帮你排查这个问题:
你的问题场景
你尝试在JMeter 2.13的BSF Sampler中用JavaScript发送POST请求,代码如下:
var http = new XMLHttpRequest(); var url = "https://localhost/oauth/token"; var params = "client_id=api_client&client_secret=sade1!&response_type=token&grant_type=client_credentials"; http.open("POST", url, true); http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); http.onreadystatechange = function() { if(http.status == 200) { alert(http.responseText); } }
但收到错误:
"org.apache.bsf.BSFException: JavaScript Error: Internal Error: org.mozilla.javascript.EcmaError: ReferenceError: "XMLHttpRequest" is not defined."
问题根源
你踩了一个常见的坑:XMLHttpRequest是浏览器提供的专属API,而JMeter的BSF Sampler用的是Rhino JavaScript引擎,它运行在Java虚拟机环境里,根本没有这个对象,所以会报引用未定义的错误。
两种可行解决方案
方案1:用Java类实现脚本请求(适合坚持用脚本的场景)
既然是在Java环境里运行脚本,我们直接用Java的HttpURLConnection类来实现POST请求,替换你的代码:
// 导入需要的Java类 var URL = Java.type("java.net.URL"); var HttpURLConnection = Java.type("java.net.HttpURLConnection"); var BufferedReader = Java.type("java.io.BufferedReader"); var InputStreamReader = Java.type("java.io.InputStreamReader"); var OutputStreamWriter = Java.type("java.io.OutputStreamWriter"); // 创建连接 var url = new URL("https://localhost/oauth/token"); var conn = url.openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-type", "application/x-www-form-urlencoded"); conn.setDoOutput(true); // 允许写入请求体 // 发送请求参数 var writer = new OutputStreamWriter(conn.getOutputStream()); var params = "client_id=api_client&client_secret=sade1!&response_type=token&grant_type=client_credentials"; writer.write(params); writer.flush(); writer.close(); // 读取响应内容 var reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); var line; var response = ""; while ((line = reader.readLine()) != null) { response += line; } reader.close(); // 可选:把响应存到JMeter变量,或者打印到日志 log.info("OAuth响应内容:" + response); vars.put("oauth_response", response); // 后续可以用${oauth_response}引用这个变量
方案2:用JMeter原生HTTP Request Sampler(更推荐)
其实完全没必要写脚本,JMeter本身就是做接口测试的工具,原生的HTTP请求采样器更简单、易维护:
- 右键你的测试计划 -> 添加 -> 采样器 -> HTTP Request
- 填写以下配置:
- 协议:
HTTPS - 服务器名称或IP:
localhost - 路径:
/oauth/token - 请求方法:
POST
- 协议:
- 切换到「参数」标签,添加以下参数:
- 名称:
client_id,值:api_client - 名称:
client_secret,值:sade1! - 名称:
response_type,值:token - 名称:
grant_type,值:client_credentials
- 名称:
JMeter会自动帮你设置正确的Content-type请求头,你还能直接添加断言、查看结果树,后续调整参数也更方便。
内容的提问来源于stack exchange,提问作者Hari
相关产品推荐
相关产品推荐

