10. GraphQL 参数
5m

概述

继续我们的下一个功能!

在本课中,我们将

  • 了解 以及如何在 函数中访问它们
  • 学习如何在 中使用

模型

这是我们的下一个功能:播放列表页面。

Mockup of the playlist page

我们很有可能通过几种方式进入此页面:从精选播放列表页面点击特定播放列表,或者可能直接通过 URL 链接。

无论我们如何进入此页面,我们都需要播放列表 ID,这使得它成为使用 的完美用例。

GraphQL 参数

一个 是您为您的 中特定 提供的值。

可以使用 的提供的 来帮助确定如何填充该字段的数据。参数可以帮助检索特定对象、过滤一组对象,甚至转换字段的返回值。例如,执行搜索的 通常将用户的搜索词作为参数提供。

新的入口点

我们的模式再次进化!我们正在添加一个新的入口点。

Query 类中,我们将添加一个新的 ,名为 Playlist,它返回一个可空 Playlist 类型。我们将其设为可空是因为我们正在查找的播放列表可能不存在(例如,它可能已被删除)。

Query.cs
public Playlist? Playlist()
{
}

这可能会让您 稍微 困惑,因为有一个名为与 相同的 函数,所以我们可以做的是将此解析器重命名为 GetPlaylist。在幕后,Hot Chocolate 将删除 Get 前缀并将其映射到与如果我们将其命名为 Playlist 相同的

Query.cs
public Playlist? GetPlaylist()

注意: Hot Chocolate 将对以 结尾 的函数执行相同的操作 Async

作为函数中的参数,我们将定义一个 id,类型为 string,并添加 [ID] 属性以表示这应该在 中为 ID 类型。

请注意,id 参数可以命名为任何名称,例如 playlistId!我们建议与您的团队协作以决定命名约定。使用 id 作为 名称为常用约定。

Query.cs
public Playlist? GetPlaylist([ID] string id)

我们还将在此 中包含 SpotifyService

Query.cs
public Playlist? GetPlaylist([ID] string id, SpotifyService spotifyService) {

我们需要从 spotifyService 中调用的 方法是 GetPlaylistAsync,它将 id 作为参数。我们将结果保存在名为 response 中。

Query.cs
var response = spotifyService.GetPlaylistAsync(id);

这里的模式将与 FeaturedPlaylists 非常相似。我们将使函数 async,等待响应并返回 Task<T> 类型。

Query.cs
public async Task<Playlist?> GetPlaylist([ID] string id, SpotifyService spotifyService)
{
var response = await spotifyService.GetPlaylistAsync(id);
}

需要返回 Playlist 类型,但 response 目前为 SpotifyWeb.Playlist 类型。

跳到 Playlist.cs 文件中,让我们在 Playlist 类中添加一个 新的、附加的构造函数。我们将传入一个 SpotifyWeb.Playlist 对象并使用其属性初始化我们自己的 Playlist 的属性。

Playlist.cs
public Playlist(SpotifyWeb.Playlist obj)
{
Id = obj.Id;
Name = obj.Name;
Description = obj.Description;
}

(我们将在下一课中处理播放列表的曲目!)

回到 中,让我们通过使用 response 创建 Playlist 对象,然后返回结果来完成此熟悉的模式。

Query.cs
var playlist = new Playlist(response);
return playlist;

不要忘记 GetPlaylist 的描述

Query.cs
[GraphQLDescription("Retrieves a specific playlist.")]

让我们保存更改并确保我们的服务器仍然在没有问题的情况下成功运行。

探索时间!

是时候看看我们的 如何随着这些更改而演变!让我们回到 Sandbox 并创建一个新的工作区。

在 Explorer 页面中,导航回到 Query 类型在 文档 面板中,我们可以看到一个新的 playlist(...)

点击“”旁边的 + 按钮,将所有三个播放列表字段添加到 中。

https://studio.apollographql.com/sandbox/explorer

GetPlaylist operation in Sandbox

query Playlist($playlistId: ID!) {
playlist(id: $playlistId) {
id
name
description
}
}

我们会注意到这里有新东西:美元符号 ($) 后面跟着名称 playlistId

变量

The $ symbol indicates a variable in . The name after the $ symbol is the name of our , which we can use throughout the . After the colon is the variable's type, which must match the type of the we'll use it for.

are great—they let us pass values dynamically from the client-side so we don't have to hardcode values into our . We'll use them every time we create a query with arguments.

In our case, we have a called playlistId that the Explorer set up for us down in the Variables section. Right now, it's set to null.

https://studio.apollographql.com/sandbox/explorer

GetPlaylist operation with null variable

If we try to run the now, we'll still get a JSON object back, but this time with an errors key, instead of data:

Response
{
"errors": [
{
"message": "Variable `playlistId` is required.",
"locations": [
{
"line": 1,
"column": 16
}
],
"extensions": {
"code": "HC0018",
"variable": "playlistId"
}
}
]
}

This lets us know that we can't leave the playlistId as null, because the schema specifically defines the id (where we're using the playlistId ) as a non-nullable type!

Let's go ahead and update the null value to a playlist ID we know exists from the featuredPlaylists .

变量
{
"playlistId": "6Fl8d6KF0O4V5kFdbzalfW"
}

Lastly, we'll rename the to be a bit more descriptive — like GetPlaylistDetails.

GraphQL operation
query GetPlaylistDetails($playlistId: ID!) {
playlist(id: $playlistId) {
id
name
description
}
}

Run the to get the details of the Sweet Beats & Eats playlist!

https://studio.apollographql.com/sandbox/explorer

GetPlaylist operation with playlistId

Practice

在解析器中,GraphQL 参数的目的是什么?
为什么从 GetPlaylist 解析器返回的 Playlist 类型被标记为可为空的?
在 GraphQL 中,变量如何在查询中表示?

Key takeaways

  • are values provided for a particular in a . use field arguments to determine how to populate data for that field.
  • The $ symbol indicates a in . The name after the $ symbol is the name of our , which we can use throughout the . After the colon is the variable's type, which must match the type of the we'll use it for.

Up next

我们明白你的意思,你已经准备好开始享受音乐了!在下一课中,我们将添加播放列表的曲目。

Previous

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

本课程目前处于

测试版
.你的反馈有助于我们改进!如果你遇到困难或困惑,请告诉我们,我们会帮助你。所有评论都是公开的,必须遵循 Apollo 行为准则。请注意,已解决或已处理的评论可能会被删除。

你需要一个 GitHub 帐户才能在下面发布。还没有? 在我们的 Odyssey 论坛中发布。