8. REST 作为数据源
5m

概述

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

在本课中,我们将

  • 检查现有的 Spotify REST API,它是一个完美的 ,用于 MusicMatcher
  • 使用 OpenAPI 规范生成 Python 客户端来处理我们的 HTTP 请求、响应和类型

Spotify Web API

MusicMatcher 需要音乐,在本课程中,我们将使用 精简版官方 Spotify Web 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 对象表示法)格式返回,而在 Python 中,我们处理的是类。出于这些原因,我们需要进行一些转换、序列化和反序列化我们的 HTTP 响应类型,以转换为 Python 类型。

使用 httpx 库 是发出 HTTP 请求和处理响应的常见方法。

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

此命令执行以下步骤

  1. openapi.json 文件作为输入
  2. 生成一个名为 mock_spotify_rest_api_client 的 Python 模块
  3. 在该模块中生成一个 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 的依赖项:httpxattrs

让我们激活我们的虚拟环境。

source .venv/bin/activate

并安装依赖项

pip install httpx attrs

练习

openapi-python-client 生成的 Client 类的目的是什么?

关键要点

  • 允许使用各种 ,例如数据库、REST API 和 Webhook,来创建灵活的 API,以满足客户端应用程序的需求。
  • 一个 不需要遵循它使用的 的形状、模式或命名。
  • 我们可以使用 openapi-python-client 工具根据 OpenAPI 规范自动生成 Python HTTP 客户端,简化 HTTP 请求和响应的处理。

接下来

在下一课中,我们将连接这些部分,使用 Strawberry 的 context 功能,使这个 可供我们的 使用。

上一页

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

本课程目前处于

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

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