概述
我们的 解析器 可以从各种地方检索数据:数据库、第三方 API、Webhook 等。这些被称为 数据源。GraphQL 的妙处在于,你可以混合使用任意数量的 数据源 来创建一个满足你的客户端应用程序和图消费者需求的 API。
在本课中,我们将
- 检查现有的 Spotify REST API,它是一个完美的 数据源,用于 MusicMatcher
- 使用 OpenAPI 规范生成 Python 客户端来处理我们的 HTTP 请求、响应和类型
Spotify Web API
MusicMatcher 需要音乐,在本课程中,我们将使用 精简版 的 官方 Spotify Web 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 对象表示法)格式返回,而在 Python 中,我们处理的是类。出于这些原因,我们需要进行一些转换、序列化和反序列化我们的 HTTP 响应类型,以转换为 Python 类型。
使用 httpx 库 是发出 HTTP 请求和处理响应的常见方法。
在本课程中,我们希望关注 GraphQL 概念,而不是手动编写 REST API 中的类型。为了加快工作速度,我们将自动生成代码,从我们的 API 中获取数据。
自动生成 HTTP 客户端
我们将使用 OpenAPI Python 客户端 基于 OpenAPI 规范生成 Python 客户端。
我们已经在项目的 data
文件夹中包含了一个 openapi.json
文件。这个 OpenAPI 文件定义了端点、预期响应和响应对象的模式。
我们将使用 openapi-python-client
从命令行生成,所以让我们安装它!我们将使用 pipx 来安装软件包及其依赖项。
打开一个新的终端,并运行以下命令。
pipx install openapi-python-client --include-deps
我们应该得到以下消息作为结果
Installed package openapi-python-client 0.19.0, installed using Python 3.12.2
最后,我们将运行使用 openapi-python-client
生成以下内容的命令:
openapi-python-client generate --meta none --path data/openapi.json
此命令执行以下步骤
- 将
openapi.json
文件作为输入 - 生成一个名为
mock_spotify_rest_api_client
的 Python 模块 - 在该模块中生成一个
Client
类
终端输出应类似于以下内容
Generating mock_spotify_rest_api_client
生成的软件包将具有类似于以下内容的结构
📦 mock_spotify_rest_api_client┣ 📄 __init__.py┣ 📂 api┃ ┣ 📄 __init__.py┃ ┗ 📂 playlists┃ ┃ ┣ 📄 __init__.py┃ ┃ ┣ 📄 add_tracks_to_playlist.py┃ ┃ ┣ 📄 get_featured_playlists.py┃ ┃ ┣ 📄 get_playlist.py┃ ┃ ┣ 📄 get_playlists_tracks.py┃ ┃ ┗ 📄 search.py┣ 📂 models┃ ┃ ┣ 📄 __init__.py┃ ┃ ┣ ...┃ ┃ ┗ 📄 spotify_response_post_playlistsidtracks.py┣ 📄 client.py┣ 📄 errors.py┗ 📄 types.py
api
文件夹包含我们可以用来与 Spotify REST API 交互的端点。例如,get_featured_playlists.py
文件包含映射到 GET /browse/featured-playlists
端点的函数(它同时具有同步和异步函数)。
models
文件夹包含表示来自 Spotify REST API 的响应的类。
最后,client.py
文件包含 Client
类,我们将使用它向 Spotify REST API 发出请求。
我们几乎可以开始使用这个 数据源 了;最后一步!我们需要安装自动生成的 HTTP Client
的依赖项:httpx
和 attrs
。
让我们激活我们的虚拟环境。
source .venv/bin/activate
并安装依赖项
pip install httpx attrs
练习
openapi-python-client
生成的 Client
类的目的是什么?关键要点
- GraphQL 允许使用各种 数据源,例如数据库、REST API 和 Webhook,来创建灵活的 API,以满足客户端应用程序的需求。
- 一个 GraphQL 模式 不需要遵循它使用的 数据源 的形状、模式或命名。
- 我们可以使用
openapi-python-client
工具根据 OpenAPI 规范自动生成 Python HTTP 客户端,简化 HTTP 请求和响应的处理。
接下来
在下一课中,我们将连接这些部分,使用 Strawberry 的 context
功能,使这个 数据源 可供我们的 解析器 使用。
分享您对本课的疑问和评论
本课程目前处于
您需要一个 GitHub 帐户才能在下面发布。没有? 请改为在 Odyssey 论坛中发布。