6. 添加子图
5m

概述

让我们给我们的添加一些内容 - 从字面上讲!我们将把我们的配乐数据与需要音乐的餐点配对!使用,这非常简单:我们只需点击几下!

在本课中,我们将

  • 添加一个新的到我们的中,使用 Studio
  • 检查一个

介绍食谱

每个人都需要一个好的配乐来搭配他们正在制作的特殊菜肴!为此,我们即将了解食谱 API;它是另一个成熟的,它具有模式、

我们可以使用沙盒来探索它。这是端点:

食谱 API
https://poetic-recipes-api-2f18189a9776.herokuapp.com
https://studio.apollographql.com/sandbox

Sandbox - recipes API

现在,API 只是一个小型食谱集合。我们可以询问一些事情,例如

  • 一个随机食谱
  • 其数据库中的所有食谱列表
  • 最近添加的食谱
  • 特定食谱的配料、烹饪时间、说明等

最酷的部分?它不是一个 .NET 服务器。相反,它是用 JavaScript 编写的,并使用Apollo Server!请记住,这对我们的来说不是问题。我们加入的每个都可以使用不同的语言或框架编写。我们即将看到这一点的实际应用!

让我们将这个及其全新的功能欢迎到我们的 API 中 - 我们无需克隆存储库或进行任何调整即可实现。

添加子图

  1. 转到您的在 Studio 中的页面,并导航到子图页面。我们可以看到我们的soundtracks 已经在这里,指向我们托管它的位置。

  2. 点击添加子图

    https://studio.apollographql.com/

    Studio - Add subgraph button

    注意:您也可以使用添加一个,就像我们对soundtracks 所做的那样!要查找说明,请单击添加子图旁边的箭头,然后选择使用 Rover CLI 添加子图

  3. 我们需要提供关于的两件事:它的 URL 和它的名称。

    路由 URL
    https://poetic-recipes-api-2f18189a9776.herokuapp.com/
    子图名称
    recipes
    https://studio.apollographql.com/

    Studio - Add subgraph modal

  4. 然后,单击添加子图。需要花费几分钟时间才能让检查该是否成功与所有其他现有子图组合并生成一个过程所需的所有步骤)。就是这样!

    https://studio.apollographql.com/

    Studio - Add subgraph success

我们的新超级图模式

让我们通过导航菜单查看变更日志

https://studio.apollographql.com/

Changelog page in Studio

我们可以看到我们的已经扩展了 - 其中包含与食谱相关的类型和!我们拥有IngredientRecipe以及几个添加到我们中的新,例如allRecipesrecentlyAddedRecipes

所有这些新的类型和很可能都来自recipes 。我们可以通过转到模式页面来确认哪些来自哪个子图。

引用选项卡下,选择查询后,我们可以看到我们的入口点。在子图列中,指示每个来自哪个

https://studio.apollographql.com/

Schema reference page for the Query type in Studio

我们拥有四个来自我们入口点的可用新allRecipesrandomReciperecentlyAddedRecipes和一个特定的recipe(id)

我们的已经正式扩展了!

发送查询

有了配乐和食谱数据,您是否迫不及待地想测试我们的的功能?让我们尝试发送一个涉及这两个的查询。

让我们回到查询选项卡,在模式页面中,我们可以看到我们的所有可用入口点。在操作列中,单击模式页面中recipe旁边的播放图标。

https://studio.apollographql.com/

Schema reference page in Studio, click the play icon next to the cookware field

这将打开 Explorer,并显示“文档”选项卡,其中包含 ,以及用于构建我们的 的内容。

https://studio.apollographql.com/

Explorer, with the recipe field open in the Documentation field

如果您当前在“操作”面板中有一个 ,请清除它或打开一个新的 Explorer 选项卡。我们要从这里开始!

recipe 下,我们可以看到它的描述——根据 ID 返回特定菜谱——以及 ,用于 Recipe 类型。让我们添加 namecookingTimedescriptioninstructions

query Recipe($recipeId: ID!) {
recipe(id: $recipeId) {
name
cookingTime
description
instructions
}
}

因为此 返回特定菜谱的数据,我们需要为它提供一个 ID 作为 。以下是我们可以粘贴到“变量”面板的内容。

变量
{
"recipeId": "recgUKbxnQssl9fYc"
}

这些是来自 recipes 的数据 !让我们将来自 soundtracks 的数据 加入进来!为什么不提取精选播放列表的数据呢?

在 Explorer 中有一个方便的快捷方式来搜索我们架构中的此 。按 Command + KCtrl + K 访问聚光灯搜索。开始输入 featuredPlaylistsQuery.featuredPlaylists 应该会弹出。

https://studio.apollographql.com/

Explorer using Spotlight to search for a specific field

我们将选择该 ,现在我们可以在“文档”面板中直接访问它。这节省了我们几个点击,尤其是当我们的 继续增长时!

让我们添加 featuredPlaylists ,并请求每个播放列表的 name 作为子

最后,我们将重命名 ,使其更明确。将其命名为 GetRecipeAndPlaylists

您的 现在应该看起来像这样:

query GetRecipeAndPlaylists($recipeId: ID!) {
recipe(id: $recipeId) {
name
cookingTime
description
instructions
}
featuredPlaylists {
name
}
}

让我们运行它!

https://studio.apollographql.com/

Query returning data

哇,我们得到了数据!一个查询,但数据来自两个不同的子图 🤯🎉

查询计划

我们可以通过检查 查询计划 来验证每个 的数据来自哪里。查询计划就像一个操作的蓝图:它包含一组指令,路由器会使用这些指令将较小的操作发送到负责这些特定 的子图。

点击“响应”旁边的箭头,然后选择“查询计划预览”。

Query plan preview

我们可以将其视为图表,或者如果我们选择“以文本形式显示计划”图标,可以将其视为文本。

Query plan preview

查询计划预览
QueryPlan {
Parallel {
Fetch(service: "recipes") {
{
recipe(id: $recipeId) {
name
cookingTime
description
instructions
}
}
},
Fetch(service: "soundtracks") {
{
featuredPlaylists {
name
}
}
},
},
}

我们不用太担心查询计划语法——路由器知道发生了什么!但这在我们开始涉及更多子图和需要优化的更复杂查询时非常有用。

对于这个特定的 ,我们可以看到 recipe 及其子字段来自 recipes featuredPlaylists 及其子字段来自 soundtracks 。这两个较小的操作并行运行并由各自的子图解析,路由器负责将它们捆绑在一起,并将它们作为一个响应返回给客户端。

添加一个 很容易!但现在,你可能会觉得这两个子图中的数据是分开的,彼此孤立。没有东西可以将 soundtracks 与特定的菜谱直接 连接。毕竟,我们希望用完美的播放列表来烹饪!

新功能:菜谱的推荐播放列表

我们想询问特定菜谱的详细信息:它的描述、说明和配料,以及与之搭配的推荐播放列表!对于每个播放列表,我们还想查看曲目列表。

Music Matcher Mockup of a recipe and recommended playlists

花点时间查看上面的模型,并练习以架构为先的 设计 方法。以下是一些供您思考的问题:

  • 您将如何设计您的 来满足此页面对数据的需求?
  • 我们现有的 API 中有什么?我们可以添加什么?
  • 这个页面的 可能是什么样子的?

架构优先设计

准备好了吗?以下页面需要的哪些数据片段(架构中的类型和 ):

Music Matcher Mockup of a recipe and recommended playlists - breakdown of data

以及每个播放列表需要什么

Music Matcher Mockup playlists - breakdown of data

梦寐以求的查询

最后,以下是可以为该页面构建的 的样子:

梦寐以求的查询
query GetRecipeAndRecommendedSoundtracks {
randomRecipe {
id
name
description
ingredients {
text
}
instructions
recommendedPlaylists {
id
name
description
tracks {
id
name
explicit
durationMs
}
}
}
}

注意:您想知道“梦寐以求的 ”这个词来自哪里吗?请查看 Yelp 的博文,了解更多详细信息。

理想情况下,我们会与前端客户端团队合作来决定和验证这个 。在这里,我们已经决定让页面返回一个随机食谱的详细信息(通过 randomRecipe ),并且该特定食谱将有一个名为 recommendedPlaylists 的字段。

这个新的 recommendedPlaylists 对于 Recipe 类型应该由 soundtracks 负责,它包含所有与播放列表和曲目相关的内容!

所以我们需要一种方法来连接这两个 之间的数据,以使我们梦寐以求的 能够正常工作(提示:它被称为实体!)。

但首先,让我们设置本地开发环境,以确保我们对 soundtracks 的更改不仅能够正常工作,而且能够与 recipes 相处融洽。

练习

要添加新的子图,GraphOS 需要知道哪些值?

关键要点

  • 要添加新的 ,我们可以使用 Studio UI 或
  • 我们可以使用 Explorer 查看

接下来

让我们在下一课中为本地开发做好准备。

上一页

分享您对本课的疑问和评论

本课程目前处于

测试版
.您的反馈对我们改进课程大有帮助!如果您卡住或感到困惑,请告诉我们,我们会帮助您。所有评论都是公开的,必须遵守 Apollo 行为准则。请注意,已解决或已处理的评论可能会被删除。

您需要一个 GitHub 帐户才能在下方发帖。没有帐户吗? 请在我们的 Odyssey 论坛上发帖。