GraphQL 操作名称是不是会改变查询行为?

Posted

技术标签:

【中文标题】GraphQL 操作名称是不是会改变查询行为?【英文标题】:Does a GraphQL Operation Name Ever Change Query Behavior?GraphQL 操作名称是否会改变查询行为? 【发布时间】:2019-09-19 14:14:36 【问题描述】:

我是 GraphQL 的超级新手。我仍在了解基本概念和语言。在问我的问题时,我可能会说一些严重错误的话——如果我这样做,我会很感激更正。

小问题:操作的名称对查询的行为有影响吗?

也就是说,我的理解是,给定一个看起来像这样的 GraphQL 查询

query SomeQueryName 
    flower 
        name
        petal_number
    
 

其中query是操作类型,SomeQueryName是操作名称。

在解析查询时是否使用过这些名称?或者它们是否严格地是客户端程序员在编写查询时可以包含的东西,以帮助他们组织自己的代码?或者其他一些我没有想到的事情。

【问题讨论】:

【参考方案1】:

查询名称对服务器没有任何意义。解析查询时不使用它,仅使用查询的内容。所以你的例子相当于这个:

query 
    flower 
        name
        petal_number
    
 

该名称仅用于前端的 GraphQL 客户端或用于调试目的。

【讨论】:

【参考方案2】:

操作的名称与解析操作中的字段无关。 然而,当单个 GraphQL 文档中存在多个操作定义时,它是相关的。 From the spec:

要执行一个请求,如果文档定义了多个操作,则执行器必须有一个解析的文档和一个选定的操作名称才能运行,否则文档应该只包含一个操作。

换句话说,您的请求可能包含这样的文档:

query Query1 
  someField


query Query2 
  someOtherField

当存在多个命名操作时,客户端还必须指定operationName 参数(除了queryvariables)。通过这样做告诉 GraphQL 服务执行该特定操作并忽略所有其他操作。发送多个操作而不指定operationName——或包含多个未命名操作将导致请求失败。

在上述之外,正如@jo_va 所提到的,提供操作名称的唯一其他目的是用于调试或供客户端使用。例如,apollo-link-watched-mutation 使用操作名称来解决 Apollo 客户端的常见缓存问题。

【讨论】:

以上是关于GraphQL 操作名称是不是会改变查询行为?的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL查询语言中的CSRF漏洞

Gatsby - GraphQL - StaticQuery 标签 - 由于查询字符串的奇怪行为,站点无法编译

既不是突变也不是查询的 Apollo/GraphQL 动作

在短 GraphQL 查询上返回 null

如何在 GraphQL (Relay) 中查询和改变数组类型?

为啥即使我们尝试获取数据而不是更新/提交新数据,GraphQL 也会查询 POST 请求?