使用GraphQL构建高效API

news/2024/11/5 20:56:09
💓 博客主页:瑕疵的CSDN主页
📝 Gitee主页:瑕疵的gitee主页
⏩ 文章专栏:《热点资讯》

使用GraphQL构建高效API

    • 引言
    • GraphQL 简介
      • 设置 GraphQL 服务器
        • 安装依赖
        • 创建 GraphQL 服务器
      • 查询操作
      • 变更操作
      • 实际案例
        • 博客应用
      • 最佳实践
        • 数据验证
        • 错误处理
        • 性能优化
      • 总结

引言

随着互联网应用的快速发展,API 设计变得越来越重要。传统的 RESTful API 虽然广泛使用,但在某些场景下存在不足,如过度获取数据、多次请求等问题。GraphQL 是一种数据查询和操作语言,旨在提供更高效、灵活的数据访问方式。本文将详细介绍如何使用 GraphQL 构建高效 API,包括基本概念、设置 GraphQL 服务器、查询和变更操作、以及实际案例等内容。

GraphQL 简介

GraphQL 是一种用于 API 的查询语言,由 Facebook 开发并于 2015 年开源。GraphQL 的主要特点包括: - **强类型系统**:GraphQL 具有强类型系统,可以定义数据模型和查询模式。 - **单次请求**:客户端可以一次性请求所需的所有数据,减少网络请求次数。 - **灵活的数据获取**:客户端可以精确地指定所需的数据,避免过度获取。 - **强大的工具生态系统**:GraphQL 拥有丰富的工具和库,支持多种编程语言和框架。

设置 GraphQL 服务器

要使用 GraphQL,首先需要设置一个 GraphQL 服务器。以下是一个使用 Node.js 和 Express 的示例:
安装依赖
npm install express graphql apollo-server-express
创建 GraphQL 服务器
// server.js
const express = require('express');
const { ApolloServer, gql } = require('apollo-server-express');

const app = express();

// 定义 GraphQL 模式
const typeDefs = gql`
  type Book {
    id: ID!
    title: String!
    author: String!
  }

  type Query {
    books: [Book!]
  }
`;

// 定义解析器
const resolvers = {
  Query: {
    books: () => [
      { id: '1', title: 'The Great Gatsby', author: 'F. Scott Fitzgerald' },
      { id: '2', title: 'To Kill a Mockingbird', author: 'Harper Lee' },
      { id: '3', title: '1984', author: 'George Orwell' }
    ]
  }
};

// 创建 Apollo 服务器
const server = new ApolloServer({ typeDefs, resolvers });

// 将 Apollo 服务器应用到 Express 应用
server.applyMiddleware({ app, path: '/graphql' });

// 启动服务器
app.listen({ port: 4000 }, () => {
  console.log(`🚀 Server ready at http://localhost:4000${server.graphqlPath}`);
});

查询操作

GraphQL 的查询操作允许客户端精确地指定所需的数据。以下是一个查询书籍列表的示例:

query GetBooks {
  books {
    id
    title
    author
  }
}

变更操作

除了查询操作,GraphQL 还支持变更操作,用于修改服务器上的数据。以下是一个添加书籍的示例:

// 修改 resolvers
const resolvers = {
  Query: {
    books: () => [
      { id: '1', title: 'The Great Gatsby', author: 'F. Scott Fitzgerald' },
      { id: '2', title: 'To Kill a Mockingbird', author: 'Harper Lee' },
      { id: '3', title: '1984', author: 'George Orwell' }
    ]
  },
  Mutation: {
    addBook: (_, { title, author }) => {
      const book = { id: `${Date.now()}`, title, author };
      // 假设这里有一个持久化逻辑
      return book;
    }
  }
};
mutation AddBook {
  addBook(title: "Brave New World", author: "Aldous Huxley") {
    id
    title
    author
  }
}

实际案例

博客应用
假设我们有一个博客应用,需要实现文章的查询和评论的添加功能。以下是实现步骤:

  1. 定义数据模型

    // schema.js
    const typeDefs = gql`
      type Post {
        id: ID!
        title: String!
        content: String!
        comments: [Comment!]
      }
    
      type Comment {
        id: ID!
        text: String!
        author: String!
      }
    
      type Query {
        posts: [Post!]
      }
    
      type Mutation {
        addComment(postId: ID!, text: String!, author: String!): Comment
      }
    `;
    
  2. 实现解析器

    // resolvers.js
    const resolvers = {
      Query: {
        posts: () => [
          { id: '1', title: 'First Post', content: 'This is the first post.', comments: [] },
          { id: '2', title: 'Second Post', content: 'This is the second post.', comments: [] }
        ]
      },
      Mutation: {
        addComment: (_, { postId, text, author }) => {
          // 假设这里有一个持久化逻辑
          const comment = { id: `${Date.now()}`, text, author };
          return comment;
        }
      }
    };
    
  3. 启动服务器

    // server.js
    const express = require('express');
    const { ApolloServer, gql } = require('apollo-server-express');
    
    const app = express();
    
    const typeDefs = require('./schema');
    const resolvers = require('./resolvers');
    
    const server = new ApolloServer({ typeDefs, resolvers });
    
    server.applyMiddleware({ app, path: '/graphql' });
    
    app.listen({ port: 4000 }, () => {
      console.log(`🚀 Server ready at http://localhost:4000${server.graphqlPath}`);
    });
    
  4. 查询和变更操作

    query GetPosts {
      posts {
        id
        title
        content
        comments {
          id
          text
          author
        }
      }
    }
    
    mutation AddComment {
      addComment(postId: "1", text: "Great post!", author: "John Doe") {
        id
        text
        author
      }
    }
    

最佳实践

数据验证
在解析器中进行数据验证,确保输入数据的有效性。

错误处理
在解析器中捕获并处理错误,确保 API 的稳定性和可靠性。

性能优化
合理设计数据模型和查询模式,避免复杂的嵌套查询和大量的数据加载。

总结

通过本文,你已经学会了如何使用 GraphQL 构建高效 API。GraphQL 的强类型系统、单次请求和灵活的数据获取特性使其成为现代 API 开发的重要工具。
GraphQL 架构图

GraphQL 可以通过精确的数据获取和减少网络请求次数,显著提升 API 的性能和用户体验。
GraphQL 查询示意图


http://www.niftyadmin.cn/n/5739854.html

相关文章

损失函数的分类

参考博客:【深度学习】损失函数详解-CSDN博客https://blog.csdn.net/LogosTR_/article/details/126366482?utm_mediumdistribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-126366482-blog-122704657.235^v43^pc_blog_bottom_rele…

TypeScript中的类型注解、Interface接口、泛型

一、认识TypeScript 1.概述 TypeScript是具有类型语法的JavaScript,是一门强类型的编程语言。它是 JavaScript 的超集(js中的所有元素都属于ts),这意味着任何有效的 JavaScript 代码本身也是有效的 TypeScript 代码。 2.优点 静…

React 前端如何通过组件完成 “下载 Excel模板” 和 “上传 Excel 文件并读取内容生成可使用的对象数组”

文章目录 一、Excel 模板下载01、代码示例 二、Excel 文件上传01、文件展示02、示例代码03、前端样式展示04、数据结果展示 三、完整代码 本文的业务需求是建立在批量导入数据的情况下,普通组件只能少量导入,数据较多的情况都会选择 Excel 数据导入&…

区块链技术与应用-PKU 学习笔记

课程地址 资料: ETH-Security 区块链学习记录_比特币 BTC 密码学原理 比特币,又称加密货币(crypto-currency),它主要利用了密码学中的哈希函数(cryptographic hash function)的抗碰撞特性(collision resistance)和单向散列特性(hiding) …

北京交通大学机器学习实验

机器学习课程概要 🐧数学基础 🍬评估 🍕线性模型 🎂神经网络 🦞支持向量机 🐂贝叶斯分类 🐏决策树 👿集成学习 ❤️聚类 🍬降维与度量学习 🐸特征选择预稀疏表…

Claude 3.5 Sonnet模型新增了PDF支持功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

【深度学习基础】深入理解 卷积与卷积核

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 卷积 1.1 …

论文阅读-用于点云分析的自组织网络

目前存在的问题: 原始的SOM(1)训练结果与初始节点高度相关(2)样本更新规则取决于输入点的顺序3D 卷积神经网络(需要将数据转换为体素,存在分辨率损失和计算成本上涨的问题)、PointN…