概述
继续我们下一个功能!
在本课中,我们将
- 了解GraphQL 参数 以及如何在 解析器 函数中访问它们
- 了解如何在 GraphQL 操作 中使用 变量
模型
这是我们的下一个功能:播放列表页面。
我们很可能通过几种方式到达此页面:从特色播放列表页面点击特定的播放列表,或者可能直接通过 URL 链接。
无论我们如何到达此页面,我们都需要播放列表 ID,这使其成为使用 GraphQL 参数 的完美用例。
GraphQL 参数
一个 参数 是您为 查询 中的特定 字段 提供的值。
解析器 可以使用 字段 提供的 参数 来帮助确定如何填充该字段的数据。参数可以帮助检索特定对象,过滤一组对象,甚至转换字段的返回值。例如,执行搜索的 查询 通常会将用户的搜索词作为参数提供。
新的入口点
我们的模式再次演变!我们正在添加一个新的入口点。
在Query
类中,我们将添加一个新的 解析器 称为 playlist
,它返回一个可为空的 Playlist
类型。我们将其设为可为空,因为我们正在查找的播放列表可能不存在(例如,它可能已被删除)。
此 解析器 将是 async
的,我们将使用 strawberry.field
作为装饰器。
@strawberry.fieldasync def playlist(self) -> Playlist | None:...
记住,在 self
作为 参数 添加到 解析器 函数内部是一个良好的做法。
我们还将添加另一个参数: id
类型为 strawberry.ID
表示它应该在 GraphQL 中为 ID
类型。
请注意, id
参数可以命名为任何东西,例如 playlist_id
!我们建议与您的团队协商命名约定。使用 id
作为 GraphQL 参数 名称是一种常见约定。
@strawberry.fieldasync def playlist(self,id: strawberry.ID) -> Playlist | None:...
我们还将包含 info
参数,我们稍后将使用它来访问 spotify_client
:
@strawberry.fieldasync def playlist(self,id: strawberry.ID,info: strawberry.Info) -> Playlist | None:...
在文件顶部,让我们导入一个从 mock_spotify_rest_api_client
包中获取播放列表的函数,称为 get_playlist
。
from mock_spotify_rest_api_client.api.playlists import get_playlist
现在回到 playlist
解析器,让我们使用此函数从 REST API 获取播放列表数据。我们将传入相同的 spotify_client
值,以及 id
参数,用于函数期望的 playlist_id
参数。
与 featured_playlists
解析器 一样,我们将 await
结果并将它们存储在 data
变量 中。
spotify_client = info.context["spotify_client"]data = await get_playlist.asyncio(client=spotify_client, playlist_id=id)
如果 data
是 None
,这很可能意味着没有具有该特定 ID 的播放列表。在这种情况下,我们将返回 None
。
if data is None:return None
此 解析器 需要返回一个 Playlist
类型,但 data
(如果它不是 None
)是一个 SpotifyObjectPlaylist
类型。
所以让我们用我们拥有的数据属性创建一个新的 Playlist
对象,并返回它。
return Playlist(id=strawberry.ID(data.id),name=data.name,description=data.description,)
不要忘记 GraphQL 对 解析器 的描述!我们可以将其添加到 @strawberry.field
装饰器中。
@strawberry.field(description="Retrieves a specific playlist.")
让我们保存更改并确保我们的服务器仍然成功运行,没有任何问题。
探索时间!
是时候看看我们的 GraphQL 模式 在这些更改后是如何演变的!让我们回到 Sandbox 并创建一个新的工作区。
在 Explorer 页面中,导航回 Query
类型的根节点 文档 面板,我们可以看到一个新的 字段: playlist(...)
字段。
单击“字段”旁边的 + 按钮,将所有三个播放列表字段添加到 操作中。
query Playlist($playlistId: ID!) {playlist(id: $playlistId) {idnamedescription}}
我们在这里会注意到一些新东西:一个美元符号 ($
) 后面跟着名称 playlistId
。
变量
在 $
符号表示 变量 在 GraphQL 中。 $
符号后面的名称是我们 变量 的名称,我们可以在整个 查询 中使用它。冒号后面的变量类型必须与我们将用于它的 参数 的类型匹配。
变量 很棒,它们允许我们动态地从客户端传递 参数 值,因此我们不必将值硬编码到我们的 查询 中。每当我们使用参数创建查询时,都会使用它们。
在我们的例子中,我们有一个名为 playlistId
的 变量,它由 Explorer 在下面的 变量 部分为我们设置。现在,它被设置为 null
。
如果我们现在尝试运行 查询,我们仍然会得到一个 JSON 对象,但这次它包含一个 errors
键,而不是 data
:
{"errors": [{"message": "Variable `playlistId` is required.","locations": [{"line": 1,"column": 16}],"extensions": {"code": "HC0018","variable": "playlistId"}}]}
这让我们知道我们不能将 playlistId
设为 null
,因为模式专门将 id
参数 (我们在 使用 playlistId
变量) 定义为不可为空的类型!
让我们继续更新 null
值,使其成为我们从 featuredPlaylists
查询 中知道存在的播放列表 ID。
{"playlistId": "6Fl8d6KF0O4V5kFdbzalfW"}
最后,我们将 操作 重命名为更具描述性的名称,例如 GetPlaylistDetails
。
query GetPlaylistDetails($playlistId: ID!) {playlist(id: $playlistId) {idnamedescription}}
运行 查询 以获取 Sweet Beats & Eats
播放列表的详细信息!
练习
playlist
解析器返回的 Playlist
类型被标记为可为空的?主要收获
- 参数 是为 GraphQL 查询 中的特定 字段 提供的值。 解析器 使用字段参数来确定如何填充该字段的资料。
- 在
$
符号表示 变量 在 GraphQL 中。$
符号后面的名称是我们 变量 的名称,我们可以在整个 查询 中使用它。冒号后面的变量类型必须与我们将用于它的 参数 的类型匹配。
接下来
我们听到你的声音,你已经准备好享受一些音乐了!我们将在下一课中添加播放列表的曲目。
分享你关于本课的问题和评论
本课程目前处于
您需要一个 GitHub 帐户才能在下方发帖。没有? 请改在我们的 Odyssey 论坛中发帖。