【问题标题】:graphql- same query with different argumentsgraphql-具有不同参数的相同查询
【发布时间】:2018-11-14 06:24:31
【问题描述】:

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

【问题讨论】:

    标签: graphql


    【解决方案1】:

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

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

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

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

    引用:

    每个命名操作定义在文档中必须是唯一的 以它的名字命名。

    解决方案

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

    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)是没有意义的,我猜你正在这样做。为了充分发挥语言的潜力,需要进行范式转变。

    【讨论】:

      【解决方案2】:

      类型的请求有效:

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

      【讨论】:

        猜你喜欢
        • 2019-05-25
        • 1970-01-01
        • 2018-07-09
        • 1970-01-01
        • 2016-12-09
        • 1970-01-01
        • 2012-06-24
        • 2019-10-05
        • 2021-03-28
        相关资源
        最近更新 更多