概述
目前,我们将保持简单,并尝试一个经典的“你好,世界”示例来构建我们的架构。别担心,我们稍后会深入探讨播放列表和曲目!
在本课中,我们将
- 了解
Query
类型 - 根据
Query
类型创建架构
Query
类型
Query
类型定义了我们允许从我们的 GraphQL 服务器 查询的项目列表。它是我们架构的入口点!
所有 GraphQL API 相关的内容都将位于 api
文件夹中。我们将把根类型(如 Query
以及稍后的 Mutation
)保存在 api
文件夹的根目录中。所有其他 对象类型 将位于 api/types
文件夹中。
让我们在 api
的根目录中创建一个名为 query.py
的文件。
在顶部,让我们导入 strawberry
模块。
import strawberry
然后,我们将添加一个名为 Query
的类。
class Query:...
现在,这只是一个普通的 Python 类。为了将其定义为 GraphQL 类型,我们应用 strawberry.type
函数。
strawberry.type
此函数告诉 Strawberry 该类是一个 GraphQL 类型,应该包含在架构中。它还会找到类的所有属性,并将它们添加为 字段,这些字段属于 GraphQL 类型。
但它不仅仅是这些!Strawberry 在幕后使用了 dataclasses
来创建一个功能齐全的类,其中包含构造函数、相等性检查等等。
strawberry.type
接受多个 参数,但两个常用的参数是:
description
:设置 GraphQL 类型的描述,以帮助 API 消费者理解该类型是什么或应该如何使用它。name
:设置 GraphQL 架构 中的类型名称。默认情况下,Strawberry 将通过将类的名称转换为PascalCase
(一种 GraphQL 的常用约定)来生成名称。
让我们继续将 Query
类型定义为 GraphQL 类型。在类定义之前,我们将应用 strawberry.type
函数并将其用作装饰器。(这意味着我们必须添加 @
前缀!)
@strawberry.typeclass Query:
在 Query
类中,让我们定义 hello
属性,它返回一个 str
类型。(你可以删除 ...
!)
hello: str
这是有效的 GraphQL 架构 所需的最低限度。在 SDL 中,等效的 GraphQL 架构看起来像这样:
type Query {hello: String!}
定义解析器
我们仍然需要一种方法来为这个 字段 返回 数据,使用一个 解析器。为了定义解析器,我们使用 strawberry.field
函数。
strawberry.field
此函数告诉 Strawberry 类的特定属性是 GraphQL 的 字段,并且可以使用特定函数进行解析。
strawberry.field
接受多个 参数,但三个常用的参数是:
resolver
:负责为 字段 返回数据的 解析器 的函数名称。description
:设置 GraphQL 类型的描述,以帮助 API 消费者理解该类型是什么或应该如何使用它。name
:设置 GraphQL 架构 中的类型名称。默认情况下,Strawberry 将通过将属性的名称转换为camelCase
来生成名称。
定义 hello
解析器
让我们看看它是如何工作的。
首先,我们将定义一个新函数,在 Query
类 之外,名为 get_hello
。它返回一个硬编码的字符串 "Hello world"
。
def get_hello():return "Hello world"
接下来,我们需要将此函数作为 解析器 为 hello
属性。在 Query
类中,找到 hello
属性并将其设置为 strawberry.field
函数的值,传入 resolver
参数 并将其设置为 get_hello
。
hello: str = strawberry.field(resolver=get_hello)
完美,我们已经有了模式的内容和 解析器 就位。
创建模式
我们的 GraphQL 服务器 需要了解 Query
类型。在上一课中,我们使用 ...
作为我们模式的占位符。让我们将其更新为指向包含 Query
类型的真实模式。
首先,我们将在 api
文件夹中创建一个名为 schema.py
的新文件。
📦 odyssey-intro-strawberry┣ 📂 api┃ ┣ 📄 __init__.py┃ ┣ 📄 query.py┃ ┗ 📄 schema.py┣ 📂 data┃ ┗ 📄 openapi.json┣ 📄 main.py┣ 📄 pyproject.toml┣ 📄 README.md┣ 📄 requirements-dev.txt┗ 📄 requirements.txt
在里面,我们将导入 strawberry
和我们刚刚创建的 Query
类。
import strawberryfrom .query import Query
要创建模式,我们使用 strawberry.Schema
类。此类接受一个 query
参数 (我们模式的入口点)。我们将它指向 Query
类型。我们将将其存储在一个名为 变量 的 schema
中。
schema = strawberry.Schema(query=Query)
在整个课程中,我们将向模式添加更多类型。
更新 GraphQL 端点
现在我们可以更新我们的 FastAPI 应用程序以使用此模式!跳回 main.py
文件。
让我们在文件顶部导入 schema
对象。
from api.schema import schema
然后,用 schema
替换 ...
占位符。
- graphql_router = GraphQLRouter(..., path="/", graphql_ide="apollo-sandbox")+ graphql_router = GraphQLRouter(schema, path="/", graphql_ide="apollo-sandbox")
我们的 GraphQL 服务器 应该可以正常工作了!
练习
Query
类型在 GraphQL 中的目的是什么?关键要点
- 字段 的
Query
类型是我们模式的入口点。这些是 GraphQL 消费者可以 查询 的顶级 字段。 - 我们使用
strawberry.type
将一个类定义为 GraphQL 类型,并应将其包含在模式中。它还会找到类的所有属性,并将它们添加为 字段 的 GraphQL 类型。 - 我们使用
strawberry.field
函数将一个类的特定属性定义为 GraphQL 字段,并且可以使用特定函数进行解析。 - 我们可以使用
strawberry.Schema
类创建模式,并将Query
类型传递给它。
接下来
我们的 GraphQL 服务器 已准备好接收查询。在下一课中,我们将探索编写和发送查询的最佳方法:Apollo Explorer。
分享您对本课的疑问和评论
本课程目前处于
您需要一个 GitHub 帐户才能在下面发布。没有? 改在我们的 Odyssey 论坛中发布。