首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在REST中使用groovy闭包对JSON进行嵌套迭代

在REST中使用groovy闭包对JSON进行嵌套迭代
EN

Stack Overflow用户
提问于 2018-08-31 20:54:17
回答 2查看 566关注 0票数 1

对于REST端点,我有以下JSON响应:

代码语言:javascript
复制
{
  "response": {
    "status": 200,
    "startRow": 0,
    "endRow": 1,
    "totalRows": 1,
    "next": "",
    "data": {
      "id": "workflow-1",
      "name": "SampleWorkflow",
      "tasks": [
        {
          "id": "task-0",
          "name": "AWX",
          "triggered_by": ["task-5"]
        },
        {
          "id": "task-1",
          "name": "BrainStorming",
          "triggered_by": ["task-2", "task-5"]
        },
        {
          "id": "task-2",
          "name": "OnHold",
          "triggered_by": ["task-0", "task-4", "task-7", "task-8", "task9"]
        },
        {
          "id": "task-3",
          "name": "InvestigateSuggestions",
          "triggered_by": ["task-6"]
        },
        {
          "id": "task-4",
          "name": "Mistral",
          "triggered_by": ["task-3"]
        },
        {
          "id": "task-5",
          "name": "Ansible",
          "triggered_by": ["task-3"]
        },
        {
          "id": "task-6",
          "name": "Integration",
          "triggered_by": []
        },
        {
          "id": "task-7",
          "name": "Tower",
          "triggered_by": ["task-5"]
        },
        {
          "id": "task-8",
          "name": "Camunda",
          "triggered_by": ["task-3"]
        },
        {
          "id": "task-9",
          "name": "HungOnMistral",
          "triggered_by": ["task-0", "task-7"]
        },
        {
          "id": "task-10",
          "name": "MistralIsChosen",
          "triggered_by": ["task-1"]
        }
      ]
    }
  }
}

对于提取,我使用的是一个groovy gpath表达式,如下所示:

代码语言:javascript
复制
given()
.when()
.get("http://localhost:8080/workflow-1")
.then()
.extract()
.path("response.data.tasks.findAll{ it.triggered_by.contains('task-3') }.name")

这给了我正确的[Mistral, Ansible, Camunda]

我试图实现的是找到由InvestigateSuggestions任务触发的任务名称。但我不确定我必须传递给contains()contains()task-3;我只知道它的名称,即InvestigateSuggestions。所以我试着做:

代码语言:javascript
复制
given()
.when()
.get("http://localhost:8080/workflow-1")
.then()
.extract()
.path("response.data.tasks.findAll{ 
    it.triggered_by.contains(response.data.tasks.find{
    it.name.equals('InvestigateSuggestions')}.id) }.name")

它不能工作,并抱怨参数"response“被使用但没有定义。

如何从findAll闭包内部遍历外部集合以找到要传递到contains()的正确的id

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-02 15:20:14

你可以利用一个肮脏的秘密,restAssuredJsonRootObject。这是没有文档记录的(尽管据我所知,在7 year+的放心寿命内,它从未改变过)。

这样你就可以写:

代码语言:javascript
复制
given()
.when()
.get("http://localhost:8080/workflow-1")
.then()
.extract()
.path("response.data.tasks.findAll{ 
    it.triggered_by.contains(restAssuredJsonRootObject.response.data.tasks.find{
    it.name.equals('InvestigateSuggestions')}.id) }.name")

如果您不想使用这个“黑客”,那么您需要做一些类似于迈克尔·复活节在他的回答中提议的事情。

当涉及到根据响应体生成匹配时,故事会更好。见docs 这里

票数 3
EN

Stack Overflow用户

发布于 2018-09-01 18:02:39

我不确定这是否惯用,但一种方法是先找到id,然后将其替换为另一个查询:

代码语言:javascript
复制
@Test
void testCase1() {
    def json = given()
    .when()
    .get("http://localhost:5151/egg_minimal/stacko.json")

    // e.g. id = 'task-3' for name 'InvestigateSuggestions'

    def id = json
    .then()
    .extract()
    .path("response.data.tasks.find { it.name == 'InvestigateSuggestions' }.id")

    // e.g. tasks have name 'task-3'

    def tasks = json
    .then()
    .extract()
    .path("response.data.tasks.findAll{ it.triggered_by.contains('${id}') }.name")

    assertEquals(['Mistral', 'Ansible', 'Camunda'], tasks)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52122487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档