8. REST 作为数据源
5m

概述

我们的 获取的数据可以来自各种地方:数据库、第三方 API、webhook 等等。这些被称为 数据源 的美妙之处在于,您可以混合任意数量的 来创建一个 API,以满足您的客户端应用程序和图消费者需求。

在本课中,我们将

  • 检查现有的 Spotify REST API,它是 的完美选择,适用于 MusicMatcher
  • 生成 C#HttpClient 使用 OpenAPI 规范来处理我们的 HTTP 请求、响应和类型
  • HttpClient 注册到我们的

Spotify 网页 API

MusicMatcher 需要音乐,对于本课程,我们将使用 简化版官方 Spotify 网页 API。我们可以在这里访问该版本: https://spotify-demo-api-fe224840a08c.herokuapp.com/v1/docs/

https://spotify-demo-api-fe224840a08c.herokuapp.com/v1/docs/

Spotify REST API docs

让我们探索一下文档。我们有一些可用的端点,它们围绕播放列表展开——事实上,这些是我们实现之前介绍的功能所需要的全部端点!

深入研究 /browse/featured-playlists 端点,让我们点击“试用”,然后“执行”请求。

https://spotify-demo-api-fe224840a08c.herokuapp.com/v1/docs/

Spotify REST API featured playlists endpoint

https://spotify-demo-api-fe224840a08c.herokuapp.com/v1/docs/

Spotify REST API featured playlists endpoint

我们得到一个 JSON 对象,其中包含两个顶级属性: messageplaylists。在 playlists 属性内,我们有一个 items 属性,它包含一个列表,以及一些似乎与分页相关的其他属性(如 limitnextpreviousoffset)。然后 items 列表包含具有 自身 属性的对象。这些对象代表播放列表!

要获取我们想要的内容——精选播放列表列表,需要嵌套很多属性!

来自我们的 HTTP 端点的响应的形状通常与我们想要从我们的 的类型和 返回的内容并不完全匹配。这没关系!GraphQL 的优点之一是我们只公开客户端可能需要的部分。例如,在这个模式迭代中,我们只需要公开播放列表的名称、描述和 ID。

HTTP 响应也以 JSON(JavaScript 对象表示法)格式返回,而在 .NET 中,我们处理的是类。由于这些原因,我们需要进行一些转换、序列化和反序列化,将我们的 HTTP 响应类型转换为我们的 C# 类型。

一种常见的发送 HTTP 请求并处理响应的方式是使用 内置 HttpClient 类,以及内置的 System.Text.Json 包,或者 Newtonsoft Json.NET 包。

在本课程中,我们希望专注于 概念,而不是手动编写 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

此命令

  1. swagger.json 文件作为输入
  2. 生成一个类名为 SpotifyService 的 C# 客户端
  3. 将其输出到 Data/SpotifyService.cs,位于新的命名空间 SpotifyWeb

请注意,我们指定了一个与我们的 和类型定义所在的命名空间(即 Odyssey.MusicMatcher)不同的命名空间。这样做是为了避免来自我们的 HTTP 响应 和我们的 类型的类型命名冲突。

终端输出应该类似于以下内容

输出
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/any
Code has been successfully written to file.

让我们看看新创建的文件 SpotifyService.cs,它位于 Data 文件夹中!

从顶部开始,我们看到一条注释,说明文件内容是自动生成的。向下滚动到构造函数,我们可以看到这个类正在使用 HttpClient

如果我们现在尝试运行我们的项目,我们将看到一系列错误,提示有关名为 Newtonsoft 的命名空间。我们需要安装这个包才能让我们的 SpotifyService 工作。

dotnet add package Newtonsoft.Json

有了这个,我们所有的错误都应该消失了!

如果您有兴趣,可以随意更深入地检查 SpotifyService 类。我们在这里不会详细介绍每个方法和每一行的细节。但是,我们可以确信,此服务将管理向 Spotify REST API 发送 HTTP 请求的细节,并将请求转换为我们可以使用的 C# 类和类型。非常方便!

添加到我们的 GraphQL 服务器

让我们将此服务连接到我们的 ,回到 Program.cs

在顶部,我们将导入 SpotifyWeb 的命名空间。

Program.cs
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 对象时添加了它,只是为了看看它在我们的 引用中是什么样子。但现在 Playlist 对象可以通过 Query.featuredPlaylists 访问,我们不再需要它了!

让我们继续删除它。不要忘记在 AddQueryType 调用之后留下 ; 来结束语句。

Program.cs
builder.Services.AddGraphQLServer().AddQueryType<Query>();
- .AddType<Playlist>;

让我们将我们的 SpotifyService 与服务器连接起来。我们将为此使用 AddHttpClient 方法,就在 方法的上方。

Program.cs
builder.Services.AddHttpClient<SpotifyService>();

请注意,这一行与 separate AddGraphQLServer() 方法是分开的。

我们的 函数现在应该可以使用依赖注入访问 SpotifyService 。在继续之前,我们将通过一个额外的配置来整理我们的 函数。在我们的 方法上进行链接,我们将使用 RegisterService 方法并将 SpotifyService 类传递进去。

Program.cs
builder.Services.AddGraphQLServer().AddQueryType<Query>()
.RegisterService<SpotifyService>();

我们将在下一课中看到这将如何影响我们的 函数(以及如何使它们更整洁!)。

练习

nswag 生成的 SpotifyService 类的目的是什么?
GraphQL 服务器设置中的 AddHttpClient<SpotifyService>() 配置完成了什么?
为什么 SpotifyService 的命名空间与 GraphQL 服务器的命名空间不同?

主要要点

  • 允许使用各种 ,例如数据库、REST API 和 Webhook,以创建满足客户端应用程序需求的灵活 API。
  • 一个 不需要遵循其使用的 的形状、模式或命名。
  • 我们可以使用 nswag 工具根据 OpenAPI 规范自动生成 C# HTTP 客户端,简化 HTTP 请求和响应的处理。
  • The SpotifyService 使用 AddHttpClientRegisterService 方法注册到 ,使其可以通过依赖注入在 函数中使用。

接下来

让我们让我们的 SpotifyService 工作起来,获取该列表的精选播放列表!

上一节

分享您关于本课的疑问和评论

本课程目前处于

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

您需要一个 GitHub 帐户才能在下方发布。没有帐户? 改为在 Odyssey 论坛上发布。