Web services GraphQL是否支持服务器端过滤(即在客户端构建WHERE-like查询)?

Web services GraphQL是否支持服务器端过滤(即在客户端构建WHERE-like查询)?,web-services,graphql,api-design,Web Services,Graphql,Api Design,我正在研究在React.js客户端应用程序和基于关系SQL数据库构建的服务器应用程序之间使用GraphQL的可能性。应在客户端创建查询,包括复杂的SQL样式语句,如: WHERE Customer.Age BETWEEN 22 AND 25 AND Order.Status = 'Active' OR Product.Name LIKE '%foo%' 这意味着客户机通常只能收到一小部分记录(例如10而不是10) 这看起来很好,说明了一些奇怪的事情: 我希望GraphQL可以帮助客户

我正在研究在React.js客户端应用程序和基于关系SQL数据库构建的服务器应用程序之间使用GraphQL的可能性。应在客户端创建查询,包括复杂的SQL样式语句,如:

WHERE Customer.Age BETWEEN 22 AND 25
AND   Order.Status = 'Active'
OR    Product.Name LIKE '%foo%'
这意味着客户机通常只能收到一小部分记录(例如10而不是10)

这看起来很好,说明了一些奇怪的事情:

我希望GraphQL可以帮助客户定义他们自己的范围, 过滤这些数据包括适当的数据本身 将有助于确定API应添加为的作用域包含 方便的方法

在这种情况下,GraphQL似乎无法帮助API开发人员, 但似乎有人在讨论中添加@filter来实现这一点 未来

将来呢?现在GraphQL中没有过滤?我继续研究,发现了这一点。这两个示例都使用了一个名为
过滤器
的功能和一组后缀,如
\u gte

query combineMovies {
  allMovies(filter: {
    OR: [{
      AND: [{
        releaseDate_gte: "2009"
      }, {
        title_starts_with: "The Dark Knight"
      }]
    }, {
      title: "Inception"
    }]
  }) {
    title
    releaseDate
  }
}
但是,没有针对处的
过滤器
关键字的规范。 我甚至检查了文档,没有发现复杂过滤的好例子(可能是因为我没有经验)

请阐明GraphQL在类似查询的地方构建复杂SQL的能力。它是标准的一部分,还是仅仅是一个弱支持的辅助功能

我继续研究,发现了这个问题和这个

谢谢你的好话!我是这篇文章的作者,很高兴这篇文章很有帮助!让我从GraphTool API的角度回答您的问题

GraphQL查询和字段 GraphQL查询是使用字段构建的。这里我们使用
allMovies
字段中定义的
id
字段:

query allMovies {
  allMovies {
    id
  }
}
我建议您阅读更多关于GraphQL查询术语的信息

查询参数 GraphQL定义了可以附加到字段的所谓的。这些参数为GraphQL服务器编码附加信息,并影响字段的解析方式。一个常见的例子是
第一个
查询参数:

query firstMovie {
  allMovies(first: 1) {
    id
  }
}
过滤是规范的一部分,还是仅仅是一个次要功能? 让我们进一步调查

query darkKnightMovies {
  allMovies(filter: {
    title_contains: "Dark Knight"
  }) {
    id
  }
}
在上面的查询中,
filter
allMovies
字段的一个参数。如上文所示,GraphQL规范中定义了这方面的语法。但是,GraphQL没有指定此参数如何改变
allMovies
字段的解析。这仅由GraphQL后端中
allMovies
字段的解析程序的更改行为确定

结论
GraphQL提供了支持服务器端筛选所需的所有概念(查询、字段、参数)。然而,使用这些概念对过滤等特定行为进行编码取决于创建GraphQL API的开发人员。GraphQL是一种规范,有不同的客户端和服务器实现,如Apollo、GraphTool和Relay。您在问题中粘贴的代码是客户端查询,它有点复杂。在我看来,它比查询本身更接近查询生成器

Graphql查询可以是简单的,也可以是复杂的,这完全取决于您自己编写的服务器

您可以将简单的键值对发送到服务器,并在服务器端的解析器函数中构建数据库查询,然后将查询馈送到数据库以获取数据。或者,您可以在客户端构建格式良好的查询,并直接将这些查询提供给解析器函数中的数据库,而无需触摸它。我认为graqhcool选择了第二种方法

基本上包括三个步骤:

  • 客户端发送一些查询,基本上是带有序列化文本的GET或POST请求
  • 服务器上的Resolver函数将获取它,并从数据库中获取请求的数据
  • 并返回响应,从而解析请求
  • 规范可能没有提到过滤,因为它是实现细节(它只是您在post请求中使用的一个参数名),尽管它提到了过滤,但请阅读分页部分


    对于初学者来说,规范可能有点抽象,因此从Apollo server这样的实现服务器开始学习graphql可能是更好的方法和更简单的方法。

    这就引出了一个问题,即开发人员需要在服务器端做些什么来接收查询参数-我真的很难找到相关信息