GraphQL 是一种开放源代码的数据查询和操作语言,由 Facebook 开发并在 2015 年开源。与传统的 REST 架构相比,GraphQL 具有更高的灵活性,适用于遇到复杂数据查询场景的情况。在本文中,我们将学习如何使用 GraphQL 构建一个分组分页查询的 API。
为什么选择 GraphQL?
在传统的 REST 架构中,对于每个数据模型,都需要手动编写对应的 API 端点才能进行访问。这样,在数据结构变化时,API 端点也需要随之变化,这会导致大量的重复代码和维护难度。另外,在移动端和前端 Web 应用中,因为需要多次请求多个 REST API 端点,所以会产生所谓的“过渡访问(over-fetching)”和“欠缺访问(under-fetching)”问题。
GraphQL 应运而生,在传统 REST 架构中优化了这些问题,提供了更灵活的查询体验。通过 GraphQL,可以在一次请求中自由定义需要返回的数据字段和结构,并通过查询参数进行关联查询、分组分页等操作。
实现分组分页查询的 GraphQL API
在实现分组分页查询的 GraphQL API 中,需要用到 GraphQL 的两个重要特性,即查询(query)和分页(pagination)。以下是我们在这个示例中所需的查询和分页定义:
// javascriptcn.com 代码示例 type Query { books(first: Int, offset: Int, categoryId: ID): [Book] categories: [Category] } type Book { id: ID! title: String! author: String! category: Category } type Category { id: ID! name: String! books: [Book] } input BookFilter { categoryId: ID } input Pagination { first: Int offset: Int }
- Query 中,我们定义了两个查询参数
first
和offset
,它们用于分页查询。同时,还有一个categoryId
参数,它用于过滤查询结果,只返回指定分类 ID 的图书。 - Book 类型代表了一本书,其中
category
字段代表了这本书所属的分类。BookFilter
输入类型用于过滤查询结果,它可以传入categoryId
参数。 - Category 类型代表了一个分类,其中
books
字段代表了该分类下的所有书籍。在这里,我们没有定义分页信息,因为分页是通过 Books 查询来完成的。
接下来,我们可以使用 GraphQL 的解析器函数定义这些查询:
// javascriptcn.com 代码示例 const resolvers = { Query: { async books(_, { first, offset, categoryId }, { dataSources }) { const allBooks = await dataSources.BookAPI.getAll(); let filteredBooks = allBooks; if (categoryId) { filteredBooks = filteredBooks.filter( (book) => book.categoryId === categoryId ); } if (first && offset) { filteredBooks = filteredBooks.slice(offset, offset + first); } else if (first) { filteredBooks = filteredBooks.slice(0, first); } return filteredBooks; }, categories(_, args, { dataSources }) { return dataSources.CategoryAPI.getAll(); }, }, Category: { async books(parent, _, { dataSources }) { return dataSources.BookAPI.getAllByCategoryId(parent.id); }, }, };
在这里,我们使用了一个名为 BookAPI
和 CategoryAPI
的数据源来获取所有的书籍和分类。我们定义了两个根查询类型,即 books
和 categories
,在 books
中通过查询参数进行了过滤和分页,而在 categories
中则只使用了数据源。
最后,我们需要将 GraphQL schema 和解析器函数连接到 Express 应用程序上:
// javascriptcn.com 代码示例 const server = new ApolloServer({ typeDefs, resolvers, context({ req }) { const authorisation = req.headers.authorization || ""; return { dataSources: { BookAPI: new BookAPI({ authorisation }), CategoryAPI: new CategoryAPI(), }, }; }, }); server.applyMiddleware({ app });
总结
GraphQL 带来了全新的查询方式,可以大大提高数据查询的效率。本文中,我们学习了如何使用 GraphQL 构建一个支持分组分页查询的 API。
详细展示了 GraphQL 的查询和分页定义,以及查询的解析器函数定义。需要注意的是,GraphQL 支持多种编程语言,不同语言的实现方式略有不同。
希望本文能够对学习和使用 GraphQL 有所帮助,如果您想了解更多关于 GraphQL 的内容,可以访问 GraphQL 官网 了解更多。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6538ced67d4982a6eb1e4845