通过 Apollo 进行 GraphQL 查询
Posted
技术标签:
【中文标题】通过 Apollo 进行 GraphQL 查询【英文标题】:GraphQL queries via Apollo 【发布时间】:2019-12-06 23:46:56 【问题描述】:您好,我正在开发一个 android 应用程序,我需要使用 GraphQL。我正在尝试首先通过 following this tutorial 使用 Apollo 客户端作为练习,但在遵循它时遇到了麻烦。它只是缺少一些有用的特定信息和细节。
目前我一直在尝试构建一个 .graphql 文件。我希望至少编译代码并确保到目前为止一切正常,但显然如果不提供至少一个 .graphql 文件,您甚至无法编译它。
我已经包含了下面教程中给出的示例,我的困惑主要来自“FeedQuery”和“FeedType”到底是什么?它们是为这个特定示例定义的类,还是由 Apollo 本身生成的用于定义任何查询的类?那么在定义自己的查询或进行等价查询时,我应该只使用这两个类吗?这些参数是定义中需要的还是示例结构所特有的?
我似乎无法在他们的教程或网站中找到有关此的更多信息。尝试学习 GraphQL 已经够难的了,但是本教程中缺乏细节让事情变得更加令人沮丧。如果他们在本教程中分享了该结构的外观,那将非常有帮助,但似乎并未包含在内。
query FeedQuery($type: FeedType!, $limit: Int!)
feedEntries: feed(type: $type, limit: $limit)
id
repository
name
postedBy
login
感谢您的帮助,如果有人有更好教程的链接,我将不胜感激。
【问题讨论】:
【参考方案1】:在 GraphQL DSL 的上下文中,FeedQuery 是一个命名查询(将其视为 Java 术语中的一种方法),您可以使用它从 GraphQL 服务器检索特定数据(如查询内部所述)。
要检索所需的数据,您需要传入两个非空参数(由!
表示),feedType 和限制。第一个是由服务器实现的 GraphQL 模式定义的自定义类型。第二种是 GraphQL 标量类型。
FeedQuery 和 FeedType 都将在编译阶段转换为 Java 对象。对于查询,您将获得一个适当的构建器,以包含执行实际调用所需的所有信息。
您可以阅读完整的 Java 示例 here。它是您正在学习的教程的更完整版本。
【讨论】:
非常感谢您的回复!如果您能提供更多帮助,Android Studio 中 Java 中定义的这个查询与 GraphlQL 服务器架构中定义的查询有何关联?例如,服务器是否会将查询定义为“FeedQuery”或“feed”或“feedEntries”?如果我尝试在 Java 中定义一个在 GraphQL 模式中不存在的查询,那会导致某种错误,对吧?再次感谢,您的回答帮助我弄清楚了一些事情! 基本上我对“query FeedQuery($type: FeedType!, $limit: Int!)”和“feedEntries: feed(type: $type, limit: $限制)”。就像它们如何相互关联以及与 GraphQL 模式中定义的查询一样。 查询是您自己创建的。它必须遵守 GraphQL 模式和 DSL 语言规则。然后在编译阶段,您定义的 GraphQL 查询将转换为 Java 代码。当然,如果你的 DSL 有错误,就会抛出编译错误。 FeedQuery 将由您定义(您将描述希望服务器返回的数据)。 feedEntries 部分是由服务器定义的用于返回特定数据的查询(很像特定的 REST 调用)。希望这能澄清一点。 正确,所以“FeedQuery”是为在 Java 中使用而定义的,尽管我们可以随意命名它并且可以改变它请求的数据,但它必须对应于 GraphQL 中定义的查询架构和该查询(在架构本身中定义的查询)在这种情况下是“feedEntries:feed(...)”。我理解对了吗? 是的,虽然从技术上讲不仅仅供 Java 使用(尽管在这种情况下它是,因为它是一个 Java 项目)。例如,您可以在 ios 应用程序中重复使用相同的查询。以上是关于通过 Apollo 进行 GraphQL 查询的主要内容,如果未能解决你的问题,请参考以下文章
GraphQL + Apollo - 如何强制进行查询,似乎正在缓存一些东西
如何使用 react-apollo 使用相同的查询进行多个 graphql 查询?
Apollo GraphQL iOS - 尝试在查询中使用“ID”时出现“未找到生成的操作”错误
从 ruby gem 导出的 GraphQL 查询无法在 Xcode 项目上使用 Apollo 进行编译