复合查询

时间:2019-07-25 05:48:57

标签: rest graphql

我有一个RESTful服务,可以接受自定义查询,如下所示:

/entities/User?actions=

{
  "$link": {
    "entityType": "Manager",
    "entity": {
      "name": "John Smith"
    },
    "linkName": "managers",
    "backLinkName": "account",
    "$set": {
      "propertyName": "aclWrite",
      "propertyValue": {
        "$ref": {
          "propertyName": "entityId"
        }
      }
    }
  }
}

这只是意味着:

  • 创建用户类型为
  • 的新实体
  • 使用字段名称创建类型为Manager的新实体,并通过链接名称“ managers”将要创建的用户链接到该Manager。
  • 然后使用链接名称“ account”将要创建的Manager实体反向链接到用户,并将Manager实体写入ACL(访问控制列表)设置为要创建的User的ID。

之所以创建此查询结构,是因为我找不到任何似乎可以支持此类操作/过程的查询语言。

这里的问题是,是否有任何查询语言可以支持这种复合操作/过程,或者GraphQL可以处理这种复合语言?

1 个答案:

答案 0 :(得分:1)

作为一个规范,GraphQL不在乎您的模式定义哪些字段,这些字段采用哪些参数或您的字段解析器使用这些参数做什么。因此,设计一种模式可以让客户端组成一个等效的突变是完全可行的:

mutation {
  link(
    entityType: "Manager"
    entity: {
      name: "John Smith"
    }
    linkName: "managers"
    backLinkName: "account"
    set: {
      propertyName: "aclWrite"
      propertyValue: {
        ref: {
          propertyName: "entityId"
        }
      }      
    }
  ) {
    # some fields here to return in the response
  }
}

GraphQL不支持对同一查询内其他节点的引用,因此您可能仍需要一个输入与您现有API相同的突变。也就是说,由于请求验证,使用GraphQL可能仍然是更可取的,对于这样的复杂请求,这尤为重要。拥有GraphiQL或GraphQL Playground之类的IDE允许您使用自动完成功能编写查询也是一大优势。