繁体   English   中英

graphql-具有不同参数的相同查询

[英]graphql- same query with different arguments

可以使用图形 ql 实现以下内容:我们有getusers() / getusers(id=3) / getusers(name='John) 我们可以使用相同的查询来接受不同的参数(参数)吗?

我假设你的意思是这样的:

type Query {
    getusers: [User]!
    getusers(id: ID!): User
    getusers(name: String!): User
}

恕我直言,首先要做的是尝试。 您应该收到一条错误消息,指出Query.getusers只能定义一次,这将立即回答您的问题。

这是实际规范说这样的事情是无效的: http : //facebook.github.io/graphql/June2018/#example-5e409

引用:

每个命名操作定义在通过其名称引用时在文档中必须是唯一的。

解决方案

根据我所见,创建此类 API 的最GraphQL方法是定义过滤器输入类型,如下所示:

input UserFilter {
    ids: [ID]
    names: [String]
}

进而:

type Query {
    users(filter: UserFilter)
}

解析器将检查通过了哪些过滤器(如果有)并相应地查询数据。

这非常简单但非常强大,因为它允许客户端使用任意过滤器查询任意数量的用户。 作为后端开发人员,您可以稍后向UserFilter添加更多选项,包括一些分页选项和其他很酷的东西,同时保持旧 API 不变。 而且,当然,这取决于您希望此 API 有多灵活。

但为什么会这样呢?

警告! 我在这里和那里假设了一些事情,可能是错误的。

GraphQL 只是一个逻辑 API 层,它应该是与服务器无关的。 但是,我相信最初的实现是在 JavaScript 中(需要引用)。 如果您随后考虑在 JS 中实现 GraphQL API 的技术方面,您可能会了解为什么会这样。

每个查询都指向一个解析器函数。 在 JS 中,解析器是简单的函数,它们存储在由查询/变异/订阅名称指定的路径中的普通对象中。 您可能知道,JS 对象不能有多个同名的路径。 这意味着您只能为给定的查询名称定义一个解析器,因此无论如何,所有三个getusers都会映射到同一个函数Query.getusers(obj, args, ctx, info)

因此,即使 GraphQL 允许具有相同名称的字段,解析器也必须明确检查传递的任何参数,即if (args.id) { ... } else if (args.name) { ... } ,等等,从而部分地击败了具有单独端点的点。 另一方面,有一种总体上更好的方式(特别是从客户的角度来看)来定义这样的 API,如上所示。

最后说明

GraphQL 在概念上与 REST 不同,因此从三个端点(/users、/users/:id 和 /users/:name)的角度来思考是没有意义的,我猜你正在这样做。 为了揭示语言的全部潜力,需要进行范式转变。

该类型的请求有效:

Query {
    first:getusers(), 
    second:getusers(id=3)
    third:getusers(name='John)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM