如何使用GraphQL架构进行类似JSON Schema的数据验证?

时间:2017-08-30 15:18:46

标签: python json validation graphql jsonschema

我们正在考虑将GraphQL用于我们正在开发的无头CMS的第2版。

在此CMS的第1版中,我们使用JSON Schema在保存到数据库之前根据模式验证每个文档 - 例如,如果它是博客文章,它将针对{进行验证{1}}架构,如果它是一个综合("最好的"列表),它将根据Article架构进行验证。

对于版本2,我们正在考虑将GraphQL用于API。然后我们发现GraphQL模式基本上与JSON模式并行 - 它描述了文档结构,字段类型等。

因此,我们可以简单地拥有"一个模式真实来源",GraphQL模式,并在保存新版本时使用它来查询文档和验证新文档。 (请注意,我正在谈论针对GraphQL架构验证JSON数据,而不是针对架构验证GraphQL查询。)

我认为数据将针对架构中的所有字段进行验证,但已弃用的字段除外,因为您只想验证"最新版本"的领域。

我们可以做以下三件事之一:

  1. 直接使用GraphQL AST验证文档,即自己编写数据验证器。
  2. 使用GraphQL AST生成JSON模式,并使用标准JSON模式验证程序对其进行实际验证。
  3. 只是接受GraphQL不适合验证,并定义架构两次 - 一次在GraphQL中进行查询,再次在JSON Schema中进行验证(烦人且容易出错以使它们保持同步)。
  4. 问题:#1和#2愚蠢的想法?是否有任何GraphQL工具可以进行这种数据验证?如果没有两次定义架构,还有其他方法可以实现吗?

    作为参考,我们的后端将用Python编写,但管理UI将是客户端的React和JavaScript。这是我们正在讨论的GraphQL架构的简化版本(支持"文章"以及" Roundup"文档类型):

    Roundup

1 个答案:

答案 0 :(得分:2)

不断变化的情况下的确定性水平

GraphQL仍然是一项不断发展的技术(as it says right at the top of the spec document),因此可以肯定地说,没有真正“正确”的答案。

普通

InputObject类型(接口定义语言术语中的“输入”)以及列表(IDL术语中的“[]”)以及各种标量似乎完全涵盖了您在JSON中可以执行的操作。

如果GraphQL的Python实现符合规范,那么提供数据作为GraphQL文字或(更好)作为“变量”应提供自定义验证所能提供的一切:GraphQL验证将做正确的事。

针对您的情况的建议

基于我迄今为止使用GraphQL的工作,我的建议是“顺其自然”。如果您的GraphQL架构符合您的数据架构所需,只需使用普通的GraphQL验证。如果您进行自己的验证,那么在 GraphQL完成正常的数据形状检查后,它应该

总结以上几点,并用一个问题回答你的问题:让GraphQL正常运行有什么问题会导致验证繁重?