概述
我们的 解析器 获取的数据可以来自各种地方:数据库、第三方 API、webhook 等等。这些被称为 数据源。GraphQL 的美妙之处在于,您可以混合任意数量的 数据源 来创建一个 API,以满足您的客户端应用程序和图消费者需求。
在本课中,我们将
- 检查现有的 Spotify REST API,它是 数据源 的完美选择,适用于 MusicMatcher
- 生成 C#
HttpClient
使用 OpenAPI 规范来处理我们的 HTTP 请求、响应和类型 - 将
HttpClient
注册到我们的 GraphQL 服务器
Spotify 网页 API
MusicMatcher 需要音乐,对于本课程,我们将使用 简化版 的 官方 Spotify 网页 API。我们可以在这里访问该版本: https://spotify-demo-api-fe224840a08c.herokuapp.com/v1/docs/
让我们探索一下文档。我们有一些可用的端点,它们围绕播放列表展开——事实上,这些是我们实现之前介绍的功能所需要的全部端点!
深入研究 /browse/featured-playlists
端点,让我们点击“试用”,然后“执行”请求。
我们得到一个 JSON 对象,其中包含两个顶级属性: message
和 playlists
。在 playlists
属性内,我们有一个 items
属性,它包含一个列表,以及一些似乎与分页相关的其他属性(如 limit
、next
、previous
、offset
)。然后 items
列表包含具有 自身 属性的对象。这些对象代表播放列表!
要获取我们想要的内容——精选播放列表列表,需要嵌套很多属性!
来自我们的 HTTP 端点的响应的形状通常与我们想要从我们的 GraphQL 模式 的类型和 字段 返回的内容并不完全匹配。这没关系!GraphQL 的优点之一是我们只公开客户端可能需要的部分。例如,在这个模式迭代中,我们只需要公开播放列表的名称、描述和 ID。
HTTP 响应也以 JSON(JavaScript 对象表示法)格式返回,而在 .NET 中,我们处理的是类。由于这些原因,我们需要进行一些转换、序列化和反序列化,将我们的 HTTP 响应类型转换为我们的 C# 类型。
一种常见的发送 HTTP 请求并处理响应的方式是使用 内置 HttpClient 类,以及内置的 System.Text.Json
包,或者 Newtonsoft Json.NET 包。
在本课程中,我们希望专注于 GraphQL 概念,而不是手动编写 REST API 的类型。为了加快我们的工作,我们将自动生成 HTTP 客户端处理程序的代码。
自动生成 HTTP 客户端
我们将使用 名为 nswag 的工具,根据 OpenAPI 规范生成 C# 客户端。
我们已经在您的项目中(在 Data
文件夹中)包含了一个 swagger.json
文件。此 OpenAPI 文件定义了端点、预期响应和响应对象的模式。
我们将使用命令行中的 nswag
,因此让我们将其作为本地 .NET 工具安装。
首先,我们将创建一个清单文件。在终端中,运行
dotnet new tool-manifest
我们应该会收到以下消息作为结果
The template "Dotnet local tool manifest file" was created successfully.
然后,安装 nswag
工具。
dotnet tool install NSwag.ConsoleCore --version 14.0.1
安装成功后,我们将看到以下消息
You can invoke the tool from this directory using the following commands: 'dotnet tool run nswag' or 'dotnet nswag'.Tool 'nswag.consolecore' (version '14.0.1') was successfully installed. Entry is added to the manifest file [/path/to/dotnet-tools.json].
最后,我们将运行命令来使用 nswag
。
dotnet nswag openapi2csclient \/input:Data/swagger.json \/classname:SpotifyService \/namespace:SpotifyWeb \/output:Data/SpotifyService.cs
此命令
- 将
swagger.json
文件作为输入 - 生成一个类名为
SpotifyService
的 C# 客户端 - 将其输出到
Data/SpotifyService.cs
,位于新的命名空间SpotifyWeb
下
请注意,我们指定了一个与我们的 GraphQL 服务器 和类型定义所在的命名空间(即 Odyssey.MusicMatcher
)不同的命名空间。这样做是为了避免来自我们的 HTTP 响应 对象类型 和我们的 GraphQL 模式 类型的类型命名冲突。
终端输出应该类似于以下内容
NSwag command line tool for .NET Core Net70, toolchain v13.20.0.0 (NJsonSchema v10.9.0.0 (Newtonsoft.Json v13.0.0.0))Visit http://NSwag.org for more information.NSwag bin directory: /Users/apollo/.nuget/packages/nswag.consolecore/13.20.0/tools/net7.0/anyCode has been successfully written to file.
让我们看看新创建的文件 SpotifyService.cs
,它位于 Data
文件夹中!
从顶部开始,我们看到一条注释,说明文件内容是自动生成的。向下滚动到构造函数,我们可以看到这个类正在使用 HttpClient
。
如果我们现在尝试运行我们的项目,我们将看到一系列错误,提示有关名为 Newtonsoft
的命名空间。我们需要安装这个包才能让我们的 SpotifyService
工作。
dotnet add package Newtonsoft.Json
有了这个,我们所有的错误都应该消失了!
如果您有兴趣,可以随意更深入地检查 SpotifyService
类。我们在这里不会详细介绍每个方法和每一行的细节。但是,我们可以确信,此服务将管理向 Spotify REST API 发送 HTTP 请求的细节,并将请求转换为我们可以使用的 C# 类和类型。非常方便!
添加到我们的 GraphQL 服务器
让我们将此服务连接到我们的 GraphQL 服务器,回到 Program.cs
。
在顶部,我们将导入 SpotifyWeb
的命名空间。
using SpotifyWeb;
我们将在 AddType<Playlist>
符号下看到一个错误弹出。
'Playlist' is an ambiguous reference between 'Odyssey.MusicMatcher.Playlist' and 'SpotifyWeb.Playlist'CS0104
还记得我们在 Types
文件夹中定义的 Playlist
类吗?自动生成的 SpotifyService
类定义了相同的类型,名称也相同!这就是为什么我们在运行 nswag
命令时指定了不同的命名空间,以避免命名冲突。
但是现在,AddType<Playlist>
模糊不清;我们是指的是 SpotifyWeb.Playlist
还是 Odyssey.MusicMatcher.Playlist
?我们指的是后者,所以我们应该把它改成 AddType<Odyssey.MusicMatcher.Playlist>
。
然而,我们也可以完全删除该方法,因为它不再需要。我们之前在无法通过 Query
类型访问 Playlist
对象时添加了它,只是为了看看它在我们的 GraphQL 模式 引用中是什么样子。但现在 Playlist
对象可以通过 Query.featuredPlaylists
字段 访问,我们不再需要它了!
让我们继续删除它。不要忘记在 AddQueryType
调用之后留下 ;
来结束语句。
builder.Services.AddGraphQLServer().AddQueryType<Query>();- .AddType<Playlist>;
让我们将我们的 SpotifyService
与服务器连接起来。我们将为此使用 AddHttpClient
方法,就在 GraphQL 服务器 方法的上方。
builder.Services.AddHttpClient<SpotifyService>();
请注意,这一行与 separate AddGraphQLServer()
方法是分开的。
我们的 解析器 函数现在应该可以使用依赖注入访问 SpotifyService
。在继续之前,我们将通过一个额外的配置来整理我们的 解析器 函数。在我们的 GraphQL 服务器 方法上进行链接,我们将使用 RegisterService
方法并将 SpotifyService
类传递进去。
builder.Services.AddGraphQLServer().AddQueryType<Query>().RegisterService<SpotifyService>();
我们将在下一课中看到这将如何影响我们的 解析器 函数(以及如何使它们更整洁!)。
练习
nswag
生成的 SpotifyService
类的目的是什么?AddHttpClient<SpotifyService>()
配置完成了什么?SpotifyService
的命名空间与 GraphQL 服务器的命名空间不同?主要要点
- GraphQL 允许使用各种 数据源,例如数据库、REST API 和 Webhook,以创建满足客户端应用程序需求的灵活 API。
- 一个 GraphQL 模式 不需要遵循其使用的 数据源 的形状、模式或命名。
- 我们可以使用
nswag
工具根据 OpenAPI 规范自动生成 C# HTTP 客户端,简化 HTTP 请求和响应的处理。 - The
SpotifyService
使用AddHttpClient
和RegisterService
方法注册到 GraphQL 服务器,使其可以通过依赖注入在 解析器 函数中使用。
接下来
让我们让我们的 SpotifyService
工作起来,获取该列表的精选播放列表!
分享您关于本课的疑问和评论
本课程目前处于
您需要一个 GitHub 帐户才能在下方发布。没有帐户? 改为在 Odyssey 论坛上发布。