使用GraphQL构建强大的API

科技前沿观察 2019-08-02 ⋅ 15 阅读

在过去的几年中,GraphQL已经成为构建API的首选技术之一。由Facebook开发并于2015年开源发布,GraphQL提供了一种更高效、更灵活的方式来定义和调用API。相对于传统的REST架构,GraphQL能够满足更多个性化和灵活的数据需求。

GraphQL的优势

精确获取所需的数据

使用REST API时,你经常会面临获取过多或过少数据的问题。要么无法获取到你需要的所有数据,要么获取到了太多不必要的数据。这是因为REST API使用固定的数据结构,无法满足每个客户端的个性化需求。

GraphQL通过使用自定义查询来解决了这个问题。客户端可以明确指定需要的数据,并且服务器会返回与查询一致的数据。这样,你就不会在请求和响应中浪费带宽了。

可以一次获取多个资源

在REST API中,如果你需要获取关联的资源,你可能需要多次请求。例如,你要获取一个用户及其所有的帖子,你可能需要先获取用户信息,然后再发起一个请求来获取帖子列表。这样的请求会导致多次往返服务器通信的开销。

在GraphQL中,你可以使用查询和类型系统来获取多个资源。你只需要发起一个GraphQL请求,然后使用嵌套查询语句来获取相关资源。这极大地减少了网络开销。

自我描述的API

使用REST API,你必须参考API文档来了解可用的资源和端点。当API发生变化时,你可能需要再次查看文档以了解更改的影响。

GraphQL通过使用Schema(模式)来定义API。Schema是一个精确描述可用资源和操作的结构。客户端可以查询Schema来了解可用的资源和操作,而无需翻阅文档。这使得API更加自我描述且易于理解。

如何使用GraphQL构建API

定义Schema

要构建GraphQL API,首先需要定义一个Schema。Schema定义了可用的类型和操作。

type User {
  id: ID!
  name: String!
  email: String!
  posts: [Post!]!
}

type Post {
  id: ID!
  title: String!
  content: String!
  author: User!
}

type Query {
  getUser(id: ID!): User!
  getPost(id: ID!): Post!
}

type Mutation {
  createUser(name: String!, email: String!): User!
  createPost(title: String!, content: String!, authorId: ID!): Post!
}

上述Schema定义了两个类型(User和Post),两个查询操作(getUser和getPost)以及两个变更操作(createUser和createPost)。

实现解析器

在定义了Schema后,需要实现解析器来处理查询和变更操作。

const resolvers = {
  Query: {
    getUser: (parent, { id }) => {
      // 查询并返回用户信息
    },
    getPost: (parent, { id }) => {
      // 查询并返回帖子信息
    }
  },
  Mutation: {
    createUser: (parent, { name, email }) => {
      // 创建用户并返回用户信息
    },
    createPost: (parent, { title, content, authorId }) => {
      // 创建帖子并返回帖子信息
    }
  },
  User: {
    posts: (user) => {
      // 查询并返回用户的所有帖子
    }
  },
  Post: {
    author: (post) => {
      // 查询并返回帖子的作者信息
    }
  }
};

解析器根据查询和变更操作的定义,将请求和数据进行处理和映射。有了解析器,API就可以理解和执行GraphQL查询和变更操作。

使用GraphQL服务器

最后,将Schema和解析器与GraphQL服务器进行绑定。

const { ApolloServer } = require('apollo-server');

const server = new ApolloServer({
  typeDefs: schema,
  resolvers
});

server.listen().then(({ url }) => {
  console.log(`GraphQL API server running at ${url}`);
});

这样,GraphQL API服务器就搭建好了,并可以接收和处理GraphQL查询和变更请求了。

结论

GraphQL作为一种现代化的API技术,提供了更灵活和高效的方式来定义和调用API。它解决了传统REST API所面临的一些问题,如过载的数据传输和多次请求等。通过合理定义Schema,并实现相应的解析器,你可以构建出强大的、自我描述且易于理解的API。现在就尝试使用GraphQL构建你的下一个API吧!


全部评论: 0

    我有话说: