我有2个HTTP请求:一个请求从api获取数据,另一个请求将数据发布到api。
GET请求将多个用户带入JSON。 POST请求要求每个用户1个请求。因此,我需要:
根据用户数多次循环同一POST请求(已经通过使用while控制器来检查JSON响应中的用户数来做到这一点。)
对于每个POST请求,我都需要根据JSON响应中用户的信息来更新该请求中使用的变量。
我正在尝试的方法是在POST请求中使用BeanShell PreProcessor,但是我遇到了麻烦。
假设在POST的请求正文中一个变量称为$ {name}。我正在使用JSON Extractor PostProcessor(在GET请求上)路径:“ Travelers [0] .FirstName”,它返回第一个用户的名字,但是我需要第二个用户的名字(Travelers 1。FirstName)在发送POST请求之前将其分配给相同的变量$ {name},依此类推,每个用户都如此。
我想像这样制作一个for循环:
for (int i = 0; i <= numberOfTravelers; i++) {
vars.put("Name", Travelers[i].FirstName)
}
问题是我不知道如何从另一个先前请求的JSON响应中调用JSON路径。有没有一种方法可以将jsonpath引用到特定的JSON响应,或者将整个JSON响应保存在变量中,然后在该变量中找到特定的值作为JSON路径。
我已经使用JSON提取器尝试过此操作,但是问题是,如果我使用路径:Travellers [*]。FirstName,它实际上会获取JSON上的所有名称,但是变量$ {name}仅存储一个名称,而不是全部作为一个数组,以后我可以使用普通变量$ {name [i]}在for循环中访问它们。这就是为什么我需要从BeanSheall访问JSON路径的原因。
以下是JSON响应的示例:
{
"Travelers":
[
{
"FirstName":"VICTOR",
"Surname":"ORREGO",
"Key":"1.1",
"PassengerRPH":1,
"TypeCode":"ADT"
},
{
"FirstName":"JULIO",
"Surname":"OZAETA",
"Key":"2.2",
"PassengerRPH":2,
"TypeCode":"ADT"
}
]
}
这是我正在使用的GET请求中的PostProcesor JSON Extractor。当前正在将其从JSON响应(Victor)获得的名字分配给变量$ {Name} 我需要在(POST请求的)下一次迭代中使用变量$ {Name}来返回该路径中的下一个名称,即Julio。
答案 0 :(得分:1)
这是解决方法。
我正在提取所有名字,并使用单个JSON提取器将其存储在JMeter变量中 2.在相同的获取请求中添加JSR223 Post processor并将计数器值设置为1
vars.put("counter","1");
$ {__ javaScript(parseInt($ {counter})<= parseInt(vars.get(“ FirstName_matchNr”)),)}
4。向发布请求中添加JSR223 Pre Processor并添加以下代码
vars.put("name",vars.get("FirstName_"+vars.get("counter")));
这会将FirstName_Matchno的值存储在名称变量中。
int计数器= Integer.parseInt(vars.get(“ counter”))+1; vars.put(“ counter”,Integer.toString(counter));
您可以在结果中看到它在每次循环迭代中都使用不同的名称
让我知道是否有帮助。