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

graphql-具有不同参数的相同查询,graphql,Graphql,使用图ql可以实现以下目标: 我们有getusers()/getusers(id=3)/getusers(name='John)。我们是否可以使用同一个查询来接受不同的参数(参数)?我假定您的意思是: type Query { getusers: [User]! getusers(id: ID!): User getusers(name: String!): User } 我想首先要做的就是尝试。您应该会得到一个错误,即Query.getusers只能定义一次,这将立即

使用图ql可以实现以下目标:
我们有
getusers()
/
getusers(id=3)
/
getusers(name='John)
。我们是否可以使用同一个查询来接受不同的参数(参数)?

我假定您的意思是:

type Query {
    getusers: [User]!
    getusers(id: ID!): User
    getusers(name: String!): User
}
我想首先要做的就是尝试。您应该会得到一个错误,即Query.getusers只能定义一次,这将立即回答您的问题

以下是实际的规范,说明这样的东西是无效的:

引述:

在以下情况下,文档中的每个命名操作定义都必须是唯一的: 以其名称提及

解决方案

据我所见,创建这样一个API最简单的方法是定义一个过滤器输入类型,如下所示:

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

type Query {
    users(filter: UserFilter)
}
解析器将检查传递了哪些过滤器(如果有),并相应地查询数据

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

但为什么会这样?

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

GraphQL只是一个逻辑API层,应该是服务器无关的。然而,我相信最初的实现是用JavaScript实现的(需要引用)。如果你考虑在JS中实现Gracql 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)
}