当前位置: 首页 > 知识库问答 >
问题:

Jmeter 聚合来自 json 的某些响应值,以便在下一个请求中使用

隆礼骞
2023-03-14

我有以下来自请求的响应

[
{
    "id": 3767,
    "sellerName": "abc",
    "siteActivity": [
        {
            "siteId": -1,
            "siteName": "example.com",
            "categories": [
                {
                    "categoryId": 79654,
                    "parentId": null,
                    "name": "Photo & Picture Frames",
                    "siteName": null,
                    "channelType": null
                },
                {
                    "categoryId": 114397,
                    "parentId": null,
                    "name": "Chests of Drawers",
                    "siteName": null,
                    "channelType": null
                },
                {
                    "categoryId": 11707,
                    "parentId": null,
                    "name": "Jewellery Boxes",
                    "siteName": null,
                    "channelType": null
                },
                {
                    "categoryId": 45505,
                    "parentId": null,
                    "name": "Serving Trays",
                    "siteName": null,
                    "channelType": null
                }
            ]
        }
    ]
},
{
    "id": 118156,
    "sellerName": "xyz",
    "siteActivity": [
        {
            "categoryId": 45505,
            "parentId": null,
            "name": "Serving Trays",
            "siteName": null,
            "channelType": null
        }
    ]
}
]

现在,我需要提取“id”值和“categoryId”值,并将它们作为列表发送到下一个请求主体中。

目前,我正在使用JSON路径提取器和表达式

    $.[*].id

让我掌握所有身份证和

    $.[*].siteActivity.[categoryId]

对于类别 ID。接下来,我想使用上述值并将它们作为请求正文中的参数发送。目前,我只能提取一个id

   $.[0].id

然后将其分配给变量“id”,并在请求正文中使用以下命令

 {"ids":[{"id":"${id}"}]}

但我希望能够发送

 {"ids":[{"id":"${id}"},{"id":"${id2}"}....]}

可以有多少id没有限制,所以我不能硬编码,需要一些动态的东西来进行聚合。什么样的处理器可以帮助我?如果可以的话,请添加一些示例。

共有1个答案

衡建中
2023-03-14

我相信您应该能够使用Beanshell PostProcser来构建请求。

给定示例数据,您的$。[*].idJSONPath表达式应返回以下值:

id=[3767,118156]
id_1=3767
id_2=118156

所以基本上你需要:

    < li >确定“id”计数 < li >填充要发送的动态JSON对象 < li >将其存储到JMeter变量中以备后用

为此,在 JSONPath 提取器之后添加一个 Beanshell PostProcessor,并将以下代码放入其“脚本”区域

import net.sf.json.JSONArray;
import net.sf.json.JSONObject; // necessary imports

JSONObject data2Send = new JSONObject();
JSONArray array = new JSONArray(); // instantiate JSON-related classes

int idCount = vars.get("id").split(",").length; // get "id" variables count

for (int i = 1; i <= idCount; i++) { // for each "id" variable
    JSONObject id = new JSONObject(); // construct a new JSON Object
    id.put("id", vars.get("id_" + i));// with name "id" and value id_X 
    array.add(id);  // add object to array
} 

data2Send.put("ids",array); // add array to "ids" JSON Object
vars.put("myJSON", data2Send.toString()); // store value as "myJSON" variable

如果需要,您可以将 {“ids”:[{“id”:“3767”},{“id”:“118156”}]} 数据引用为 ${myJSON}

该方法将适用于任意数量的“id”变量。

引用:

  • 欢迎使用Json lib
  • 如何使用json-lib
  • Json-lib-JavaDoc
  • 如何使用BeanShell:JMeter最喜欢的内置组件
 类似资料:
  • 我有一个vertx服务器应用程序,在那里我收到单客户端请求,从服务器,我需要进行两次阻塞调用。例如,一个调用后端系统A,另一个调用后端系统B。我希望同时调用两个系统。我需要等待两个调用的响应,然后合并两个调用中的两个数据,然后将响应发送回客户端。我不知道如何在工人垂直运动中做到这一点。 有谁能推荐vertx中最好的方法吗?

  • 我正在使用最新版本的JMeter,并试图从JMeter发出POST请求,但我无法看到更改HTTP方法的下拉列表。你能告诉我为什么我看不到下拉列表吗? 请在下面找到JMeter的屏幕截图。它没有用于指定HTTP方法的下拉列表。

  • 我正在用空手道测试做一些测试。 首先是一个职位,期待一个201和一个位置。 第二,使用位置from response来执行get。 有人知道我怎么用空手道吗? 下面的代码是我的尝试,在许多其他代码之后。 但是我得到了: 我不明白为什么。 [编辑] 经过彼得的建议,我感谢! 打印返回: 08:59:33.610[主]信息网。凭直觉。空手道-[打印][”https://www.test.com/enp

  • 我们有一个登录后显示的用户仪表板。仪表板由多个小部件组成。每个小部件从单独的restful服务中提取内容。例如:新闻/邮件/问题/警报。每个小部件在加载到页面上后调用服务。这样就有多个webservice调用。 有没有办法减少多次通话。 它的工作方式是当第一次加载页面时,服务应该在单个调用中返回所有小部件的聚合数据。 每个服务也应该独立可用,以便可以用于刷新单个小部件和其他系统集成。 注意:小部件

  • 问题内容: 我是liferay portlet开发的初学者,我正在开发一个接收http get请求,处理一些信息并且必须返回json对象的portlet。我的问题是我的Portlet发送了整个html页面,而不仅仅是json对象。这是我的代码: 我在doView()方法中执行此操作,我知道这不是最佳做法,但目前我对此并不关心。有人可以向我解释如何仅返回json对象,但我阅读了有关serveResp

  • 红色矩形中样本结果的度量值等于0。没有可供查看的响应数据(标题和正文)。 是否可以在采样结果选项卡中获得实数而不是0 0 0 0 0 0 0,并在响应数据选项卡中获得可见的响应?

  • 我正在尝试进行第三方授权。当我向服务器发送一个POST请求时,它会发送HTML作为响应。