9. 解析器和数据源
5m

概述

负责为我们模式中的特定返回数据。到目前为止,我们已经返回了硬编码的播放列表数据,但现在是时候用对我们 REST API 的调用来替换它了。

在本课中,我们将

  • 了解如何从访问函数
  • 使用HttpClient向端点发出 REST API 调用
  • 将 HTTP 响应类型转换为我们的和模式所期望的类型

解析器

到目前为止,我们编写了不需要任何参数的函数。例如,Query.Hello 立即返回了字符串值“Hello World”。

我们还有播放列表的属性IdNameDescription,其中每个get访问器充当函数。

可以做更多的事情!解析器可以接受以下参数:

  • 的值 参数 用于标识、过滤或转换数据。我们将在下一课中介绍这一点。
  • 父级值。我们也将在后面的课程中介绍这一点。
  • HttpContext。发送到服务器的 HTTP 请求所涉及的上下文。
  • 数据源(或服务)。我们使用依赖注入注册到服务器的服务。

在本课中,我们将重点介绍参数。

访问数据源

在上一课中,我们将SpotifyService注册到我们的,以便我们可以在函数中访问它。

Query.cs中,让我们通过将SpotifyService添加为FeaturedPlaylists函数中的参数来使用SpotifyService

Query.cs
public List<Playlist> FeaturedPlaylists(SpotifyService spotifyService)

确保我们也在顶部导入了SpotifyWeb包,SpotifyService位于其中(否则,您将看到错误!)。

Query.cs
using SpotifyWeb;

就这样!我们可以在函数体中的任何地方使用spotifyService实例。

在上一课中,我们多做了一步,在我们的中使用了RegisterService<SpotifyService>,这是可选的。如果我们没有这样做,我们的函数将改为如下所示:

Query.cs
public List<Playlist> FeaturedPlaylists([Service] SpotifyService spotifyService)

我们需要包含[Service]属性以及SpotifyService才能访问它!省略它不是更简洁吗?我们认为是的!

GetFeaturedPlaylists

提示:利用您的代码编辑器的 IntelliSense 功能来了解spotifyService中有哪些可用方法!

现在我们可以访问spotifyService了,我们可以进行第一次 HTTP 调用并存储响应。

Query.cs
var response = spotifyService.GetFeaturedPlaylistsAsync();

GetFeaturedPlaylistsAsync方法映射到我们之前探索的GET /browse/featured-playlists端点。

此方法是异步的,因此我们将await结果并将该函数标记为async。对于异步函数,返回类型也需要是Task<T>类型。

Query.cs
public async Task<List<Playlist>> FeaturedPlaylists(SpotifyService spotifyService)
{
var response = await spotifyService.GetFeaturedPlaylistsAsync();
// return new List<Playlist>{...};
}

将鼠标悬停在response 上,我们可以看到它的类型是SpotifyWeb.FeaturedPlaylists。这就是我们之前看到的响应类型(在 REST API 文档中),具有messageplaylists这两个顶级属性。它不是函数应返回的类型。相反,我们必须访问response.Playlists.Items

Query.cs
var items = response.Playlists.Items;

现在items 是一个PlaylistSimplified类型集合(此类型是在SpotifyWeb中定义的)。它不完全是一个Playlist类型,但它确实包含我们需要将其转换为Playlist类型的属性!

要将PlaylistSimplified类型转换为Playlist类型,我们将创建一个新的构造函数,该构造函数位于Playlist类中。

打开Playlist.cs 并创建一个新的构造函数,该构造函数接受一个PlaylistSimplified对象,并使用该对象的属性设置每个Playlist属性。

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

不要忘记在顶部导入SpotifyWeb命名空间,因为PlaylistSimplified来自该包(最好让您的代码编辑器为您自动导入!)。

Playlist.cs
using SpotifyWeb;

现在我们可以在Query.FeaturedPlaylists 中使用此构造函数了。我们将使用Select函数遍历items集合中的每个PlaylistSimplified对象,并返回一个新的Playlist对象。

Query.cs
var playlists = items.Select(item => new Playlist(item));

最后,我们需要使用 ToList() 将集合转换为列表,以匹配 List<Playlist> 类型,这是 要返回的类型!

Query.cs
return playlists.ToList();

完美!请随意将所有内容合并到一行干净的代码中。

Query.cs
return response.Playlists.Items.Select(item => new Playlist(item)).ToList();

我们现在可以删除之前硬编码的 Playlist 对象了。

Query.cs
- return new List<Playlist>
- {
- new Playlist("1", "GraphQL Groovin'"),
- new Playlist("2", "Graph Explorer Jams"),
- new Playlist("3", "Interpretive GraphQL Dance")
- };

探索时间!

很激动想看看这些代码都做了些什么吧?确保所有文件都已保存,并且服务器正在运行最新更改。

让我们跳到Sandbox Explorer 并运行相同用于精选播放列表的

GraphQL 操作
query FeaturedPlaylists {
featuredPlaylists {
id
name
description
}
}

看,我们从 REST API 数据源中获取了精选的播放列表

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

Response data

与 REST 方式比较

让我们戴上产品应用程序开发人员的帽子,花点时间比较一下,如果我们使用 REST 而不是 ,这个功能会是什么样子。

如果我们使用 REST,应用程序逻辑将包括

  • /browse/featured-playlists 端点进行 HTTP GET 调用
  • 深入响应 JSON 的 playlists.items 属性
  • 仅检索 idnamedescription 属性,丢弃 所有其他 响应。

还有很多没有被使用的响应!如果客户端应用程序的网络速度很慢或者数据量很少,这个大的响应会带来一定的成本。

使用 ,我们获得了简短、简洁、易读的来自客户端的 ,以他们指定的完全相同的形状返回,不多不少!

所有提取数据和过滤哪些 的逻辑都在 端完成。

注意:如您所见,REST 和 可以协同工作!在此视频中了解有关此动态的更多信息"GraphQL and REST: true BFFs - Dan Boerner / API World".

练习

解析器函数可以接受哪些参数?

关键要点

  • 函数可以接受参数,例如 的值、parent 值、HttpContext 和
  • 通过使用 API 而不是 REST API,我们避免了处理大量响应数据。

下一步

激动人心的进展!但您可能在想——没有歌曲的播放列表有什么意义?在接下来的几节课中,我们将解决下一个功能:播放列表的曲目。

上一页

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

本课程目前处于

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

您需要一个 GitHub 帐户才能在下面发布。还没有吗? 请在 Odyssey 论坛上发布。