我在Mac上使用Apache JMeter 3.2 r1790748。
我有setUp Thread Group
进行身份验证调用。呼叫正常工作并输出令牌。现在,我需要将该令牌传递给HTTP Header Manager
以进行我正在进行的所有通话。
首先,这是我的令牌json输出:
{
"access_token": "aaaaaa555555555",
"token_type": "Access",
"user_id": "5555"
}
这是HTTP Header manager
的样子:
1值:Authorization
:Bearer ${access_token}
我的网络电话:
GET https://my_server.com/some_path
GET data:
[no cookies]
Request Headers:
Connection: close
Authorization: Bearer ${access_token}
Host: my_server.com
User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_91)
如您所见,变量access_token
未被设置调用中的值替换。
我尝试过的事情:
BeanShell PostProcessor:
我创建了这个脚本,它实际上正确解析并输出access_token
:
import org.apache.jmeter.protocol.http.control.Header;
import net.minidev.json.JSONObject;
import net.minidev.json.parser.JSONParser;
String jsonString = prev.getResponseDataAsString();
log.info("jsonString = " + jsonString);
JSONParser parser = new JSONParser(JSONParser.MODE_JSON_SIMPLE);
JSONObject json = (JSONObject) parser.parse(jsonString);
String access_token = json.getAsString("access_token");
log.info("access_token = " + access_token);
vars.put("access_token", access_token);
JSON Extractor:
Apply to: Main sample and sub-samples
Variable names: access_token
JSON Path expressions: access_token
Match No. (0 for Random): 1
Compute concatenation var (suffix _ALL): unchecked
Default Values: none
关于标题管理器为什么没有应用access_token
结果的值?
谢谢!
答案 0 :(得分:4)
由于您在setUp线程组中设置了一个变量,因此您无法在其他线程组中使用它,因为线程组不共享变量,只有属性。
因此,为了通过身份验证,您需要将其另存为属性:
${__setProperty(access_token, ${access_token})};
在此示例中,我使用名为access_token
的变量的值(已设置,但仅在setUp线程组中可用)来设置属性 name,可在线程组中使用。或者更改BeanShell后处理器,添加:
props.put("access_token", access_token);
然后在另一个线程组中,使用__P
或__property
函数检索它:
${__P(access_token)}
还要记住,HTTP头管理器在任何线程启动之前都会初始化,因此您也不能在那里使用变量。例如,检查this question。
如果您仍然看到空值,我建议在两个线程组中添加Debug Sampler(同时启用JMeter属性和JMeter变量),并检查破坏的位置(保存或检索时)。
答案 1 :(得分:1)
根据JMeter用户手册的Functions and Variables章节
变量是线程的本地变量;属性对所有线程都是通用的,需要使用__P或__property函数进行引用
因此,无法通过以下方式访问您在setUp线程组中定义的变量:
所以我的推荐是:
所以:
获取access_token
属性值并将其存储到相关属性的相关Groovy代码将是:
props.put('access_token', new groovy.json.JsonSlurper().parse(prev.getResponseData()).access_token)
您可以将HTTP标头管理器中的值(或您需要的任何位置)引用为:
${__P(access_token,)}