如何将映射作为参数数组传递给JMeter中的Post请求

时间:2016-01-19 15:00:21

标签: java jmeter performance-testing beanshell

想要使用以下参数生成Post请求 的参数:
is_checked: false rc_notes: "test_notes" tags: [{id: 23, is_checked: false},{id:67, is_checked:true},{id: 63, is_checked: false},{id:16, is_checked:true}] theos: []

在上文中,标记 theos 数组值将根据给定的输入动态变化。使用输入数据,JDBC sampler将从DB获取数据,并根据它来构造POST请求参数。

尝试过BeanShell PreProcessor,为Post调用构造参数。由于参数不足,导致 400错误

BeanShell代码:
import java.util.ArrayList; import java.util.HashMap; import java.lang.Integer; import java.util.List; import java.util.Map;

//Resultset count from the JDBC sampler int count = Integer.parseInt(vars.get("tag_id_#")); Map tag_parameter_map = null; List tag_param_list = new ArrayList(); List theo_param_list = new ArrayList(); for(int i=1;i<=count;i++) { tag_parameter_map = new HashMap(); tag_parameter_map.put("tag", vars.get("tag_id_" + String.valueOf(i)).toString());
tag_parameter_map.put("is_checked", "false"); tag_param_list.add(tag_parameter_map); } sampler.addArgument("rc_notes", "notes"); sampler.addArgument("is_checked", "false"); sampler.addArgument("tags", tag_param_list); sampler.addArgument("theos", theo_param_list);

任何人都可以指导我如何实现这一目标。

2 个答案:

答案 0 :(得分:0)

您需要提供JSON格式的params和正确的类型(数字和布尔值)。你需要一些库,例如org.json(别忘了用jmeter包括Jar)。所以它看起来像这样:

JSONArray tag_param_list = new JSONArray(); // empty array
JSONArray theo_param_list = new JSONArray(); // we will add elements in the loop
for(int i=1;i<=count;i++) {
    // Construct object {id:X,is_checked:false} and add to array
    theo_param_list.put(new JSONObject()
        .put("id", Integer.parseInt(vars.get("tag_id_" + i)))
        .put("is_checked", false));
}

sampler.addArgument("tags", tag_param_list.toString());
sampler.addArgument("theos", theo_param_list.toString());

答案 1 :(得分:0)

与OP讨论后,似乎要求是:

  • JSON编码的参数
  • 名称/值分隔符为:(通常不是=
  • Params分隔符是换行符(通常不是&

有了这套要求,就无法使用addArgument。相反,我提出以下解决方案:

您仍然需要相同的预处理器,代码几乎完全相同,但不是将值作为参数添加到HTTP请求中,而是将它们保存为变量:

JSONArray tag_param_list = new JSONArray(); // empty array
JSONArray theo_param_list = new JSONArray(); // we will add elements in the loop
for(int i=1;i<=count;i++) {
    // Construct object {id:X,is_checked:false} and add to array
    theo_param_list.put(new JSONObject()
        .put("id", Integer.parseInt(vars.get("tag_id_" + i)))
        .put("is_checked", false));
}
vars.put("tags", tag_param_list.toString());
vars.put("theos", theo_param_list.toString());
vars.put("rc_notes", "notes");
vars.put("is_checked", "false");

现在在HTTP请求中,切换到“正文数据”标签(而不是“参数”标签)并指定原始正文数据,如下所示:

rc_notes: ${rc_notes}
is_checked: ${is_checked}
theos: ${theos}
tags: ${tags}

这会产生这样的帖子数据:

POST data:
rc_notes: notes
is_checked: false
theos: [{"is_checked":false,"id":1},...]
tags: []

这看起来像原始海报想要的那样。