GraphQL是否支持服务器端过滤(即在客户端构建类似WHERE的查询)?

时间:2017-04-17 12:57:41

标签: 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个)。

这看起来很好Phil Sturgeon article宣称奇怪的事情:

  

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

     

在这种情况下,似乎GraphQL无法帮助API开发人员,   但似乎有人说要添加@filter来实现这一目标   将来

将来?现在没有在GraphQL中过滤?我继续研究并找到了this SO questionamazing interactive Graphcool documentation。这两个示例都使用名为filter的功能,其中包含一组后缀,如_gte

query combineMovies {
  allMovies(filter: {
    OR: [{
      AND: [{
        releaseDate_gte: "2009"
      }, {
        title_starts_with: "The Dark Knight"
      }]
    }, {
      title: "Inception"
    }]
  }) {
    title
    releaseDate
  }
}

但是,http://graphql.org处的filter关键字没有说明。 我甚至检查过Relay个文档,但没有找到复杂过滤的好例子(也许是因为我没有React经验)。

请说明GraphQL构建复杂的SQL WHERE查询的能力。它是标准的一部分还是只是弱支持的侧面功能?

2 个答案:

答案 0 :(得分:4)

  

我继续研究并找到了这个问题,并且amazing interactive Graphcool documentation

谢谢你的客气话!我是这篇文章的作者,很高兴它有用!让我从Graphcool API的角度回答您的问题。

GraphQL查询和字段

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

query allMovies {
  allMovies {
    id
  }
}

我建议阅读this article以获取有关GraphQL查询术语的更多信息。

查询参数

GraphQL定义了可以附加到字段的所谓query arguments。这些参数编码GraphQL Server的附加信息,并影响字段的解析方式。一个常见示例是first查询参数:

query firstMovie {
  allMovies(first: 1) {
    id
  }
}

是过滤规范的一部分还是只是侧面功能?

让我们进一步调查!

query darkKnightMovies {
  allMovies(filter: {
    title_contains: "Dark Knight"
  }) {
    id
  }
}

在上面的查询中,filterallMovies字段的参数。其语法方面在GraphQL规范中定义,如上所示。但是,GraphQL没有指定此参数应如何改变allMovies字段的解析。这仅取决于GraphQL后端中allMovies字段的解析程序更改行为。

结论

GraphQL提供了所有必要的概念(查询,字段,参数)以支持服务器端过滤。但是,使用这些概念来编码特定行为(如过滤)取决于创建GraphQL API的开发人员。

答案 1 :(得分:0)

Graphql是一个规范,并且有不同的客户端和服务器实现,例如Apollo,Graphcool,Relay。您在问题中粘贴的代码是客户端查询,这有点复杂。我认为它比查询本身更接近查询生成器。

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

您可以将简单的键值对发送到服务器,并在服务器端的解析器功能中构建数据库查询,然后将查询输入数据库以获取数据。或者,您可以在客户端建立格式正确的查询,然后直接将这些查询输入到解析程序功能中的数据库中,而无需触摸它。我认为graqhcool选择了第二种方法。

因此基本上涉及三个步骤:

  1. 客户端发送一些查询,基本上是带有序列化文本的GET或POST请求,
  2. 服务器上的解析器功能将其拾取并从数据库中获取请求的数据
  3. 并返回响应,从而解决了请求。

规范不是说过滤,因为它是实现细节(它只是您在发帖请求中使用的参数名称),尽管确实如此,但请阅读分页部分。

对于初学者来说,规范可能有点抽象,因此从像Apollo Server这样的实现服务器入手可能是更好的方法和更轻松的学习graphql的方法。