Web services GraphQL是否支持服务器端过滤(即在客户端构建WHERE-like查询)?
我正在研究在React.js客户端应用程序和基于关系SQL数据库构建的服务器应用程序之间使用GraphQL的可能性。应在客户端创建查询,包括复杂的SQL样式语句,如: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可以帮助客户
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可能是更好的方法和更简单的方法。这就引出了一个问题,即开发人员需要在服务器端做些什么来接收查询参数-我真的很难找到相关信息