如何使用 RESTful API 构建 GraphQL 服务?

GraphQL 是一种用于 API 的查询语言,它可以帮助我们更高效地获取需要的数据,并且可以根据需求动态地查询、组合和过滤数据。而 RESTful API 是目前最常用的 Web API 设计风格,它基于 HTTP 协议,可以实现资源的增删改查操作。那么如何使用 RESTful API 构建 GraphQL 服务呢?本文将详细介绍这个过程,并且提供示例代码和实践指导。

1. RESTful API 的设计原则

在使用 RESTful API 构建 GraphQL 服务之前,我们需要了解 RESTful API 的设计原则。RESTful API 的设计原则包括:

  • 每个资源都有唯一的标识符;
  • 使用 HTTP 动词来表示对资源的操作;
  • 使用 HTTP 状态码来表示操作的结果;
  • 使用 HATEOAS(超媒体引擎状态转移)来表示资源之间的关系。

2. GraphQL 的基本概念

在了解 RESTful API 的设计原则之后,我们需要了解 GraphQL 的基本概念。GraphQL 由类型系统、查询语言和执行器三部分组成。其中,类型系统定义了可用的查询类型和字段,查询语言用于描述需要获取的数据,执行器则负责解析查询语言并返回结果。

GraphQL 的类型系统由标量类型和对象类型两部分组成。标量类型包括 Int、Float、String、Boolean 和 ID 等,而对象类型则由字段组成,每个字段可以返回标量类型或其他对象类型。查询语言由查询、变量和片段组成,查询用于描述需要获取的数据,变量用于传递参数,片段用于重用查询语句。执行器则根据查询语言解析出需要获取的数据,并将其返回给客户端。

3. 使用 RESTful API 构建 GraphQL 服务

在了解了 RESTful API 和 GraphQL 的基本概念之后,我们可以开始使用 RESTful API 构建 GraphQL 服务了。具体步骤如下:

3.1 定义 GraphQL Schema

首先,我们需要定义 GraphQL Schema,包括对象类型、字段和查询类型。对象类型对应 RESTful API 的资源,字段对应资源的属性,查询类型对应资源的操作。例如,假设我们有一个 RESTful API,可以获取用户信息和文章信息,那么我们可以定义以下 GraphQL Schema:

type Query {
  user(id: ID!): User
  article(id: ID!): Article
}

type User {
  id: ID!
  name: String!
  age: Int!
}

type Article {
  id: ID!
  title: String!
  content: String!
}

在上面的 GraphQL Schema 中,我们定义了两个对象类型 User 和 Article,分别对应 RESTful API 的用户资源和文章资源。每个对象类型都有对应的字段,例如 User 类型有 id、name 和 age 字段,Article 类型有 id、title 和 content 字段。我们还定义了一个 Query 类型,用于定义查询类型。Query 类型有两个查询字段 user 和 article,分别对应获取用户和获取文章的操作。

3.2 编写 GraphQL Resolvers

接下来,我们需要编写 GraphQL Resolvers,用于解析查询语句并获取数据。GraphQL Resolvers 是一个函数集合,每个函数对应一个字段,用于返回该字段对应的数据。例如,对于上面的 GraphQL Schema,我们可以编写以下 GraphQL Resolvers:

const resolvers = {
  Query: {
    user: (_, { id }) => {
      // 调用 RESTful API 获取用户信息
      return fetch(`https://example.com/users/${id}`)
        .then(response => response.json())
        .then(data => {
          // 将 RESTful API 的响应转换为 GraphQL 的响应
          return {
            id: data.id,
            name: data.name,
            age: data.age,
          };
        });
    },
    article: (_, { id }) => {
      // 调用 RESTful API 获取文章信息
      return fetch(`https://example.com/articles/${id}`)
        .then(response => response.json())
        .then(data => {
          // 将 RESTful API 的响应转换为 GraphQL 的响应
          return {
            id: data.id,
            title: data.title,
            content: data.content,
          };
        });
    },
  },
};

在上面的 GraphQL Resolvers 中,我们定义了两个函数 user 和 article,分别对应查询类型中的 user 和 article 字段。每个函数都接受两个参数,第一个参数是父级对象(对于顶级查询类型,该参数为 null),第二个参数是查询参数(例如上面的 id 参数)。函数内部调用 RESTful API 获取数据,然后将 RESTful API 的响应转换为 GraphQL 的响应。

3.3 创建 GraphQL Server

最后,我们需要创建 GraphQL Server,将 GraphQL Schema 和 GraphQL Resolvers 集成起来,并且将其作为一个 Web API 提供给客户端。例如,我们可以使用 express-graphql 库创建 GraphQL Server:

const express = require('express');
const { graphqlHTTP } = require('express-graphql');

const app = express();

app.use(
  '/graphql',
  graphqlHTTP({
    schema: Schema,
    rootValue: resolvers,
    graphiql: true,
  })
);

app.listen(3000, () => {
  console.log('GraphQL Server is running on http://localhost:3000/graphql');
});

在上面的代码中,我们创建了一个 express 应用,然后使用 graphqlHTTP 中间件创建了一个 GraphQL Server。graphqlHTTP 中间件接受三个参数,分别是 GraphQL Schema、GraphQL Resolvers 和是否开启 GraphiQL。我们将 GraphQL Schema 和 GraphQL Resolvers 作为参数传递给 graphqlHTTP 中间件,然后将其挂载到 /graphql 路径上。最后,我们启动了一个监听 3000 端口的 Web 服务器。

4. 总结

本文介绍了如何使用 RESTful API 构建 GraphQL 服务,包括定义 GraphQL Schema、编写 GraphQL Resolvers 和创建 GraphQL Server。通过使用 RESTful API 构建 GraphQL 服务,我们可以更高效地获取需要的数据,并且可以根据需求动态地查询、组合和过滤数据。值得注意的是,我们需要遵循 RESTful API 的设计原则,以便将 RESTful API 和 GraphQL 服务无缝集成起来。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65c1f709add4f0e0ffbf3c44