GraphQL:强大的API查询语言

devtools/2025/1/13 13:23:15/

在这里插入图片描述

🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》
💬 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

一、引言

GraphQL是一种用于API的查询语言,也是一个满足你数据查询需求的运行时环境。由Facebook开发并开源,它提供了一种更加高效、灵活和强大的方式来获取和操作数据,与传统的RESTful API相比,在许多场景下具有显著的优势。

二、核心概念

(一)类型系统(Type System)

  1. 对象类型(Object Type)
    • GraphQL使用对象类型来定义数据的结构。例如,在一个简单的博客应用中,可能会有一个Post对象类型,它包含title(标题)、content(内容)、author(作者)等字段。定义如下:
    graphql">type Post {title: Stringcontent: Stringauthor: String
    }
    
    • 这里Post是对象类型,titlecontentauthor是该对象类型的字段,它们的数据类型分别为String
  2. 标量类型(Scalar Type)
    • 标量类型是GraphQL中的基本数据类型,包括StringIntFloatBooleanIDID类型通常用于唯一标识一个对象,比如数据库中的主键。这些标量类型不能再细分,是构建复杂类型的基础。
    • 例如,在上述Post对象类型中,titlecontent字段的类型是String,这就是标量类型的应用。
  3. 接口(Interface)和联合类型(Union Type)
    • 接口:接口用于定义一组必须实现的字段,不同的对象类型可以实现同一个接口。例如,在一个包含文章和视频的内容系统中,可以定义一个Content接口,要求实现idcreatedAt字段,然后PostVideo对象类型都可以实现这个接口。
    graphql">interface Content {id: IDcreatedAt: String
    }
    type Post implements Content {id: IDcreatedAt: Stringtitle: Stringcontent: Stringauthor: String
    }
    type Video implements Content {id: IDcreatedAt: Stringurl: Stringduration: Int
    }
    
    • 联合类型:联合类型表示可以是多种对象类型中的一种。例如,定义一个SearchResult联合类型,它可以是Post或者Video
    graphql">union SearchResult = Post | Video
    

(二)查询(Query)

  1. 基本查询结构
    • 在GraphQL中,查询是获取数据的主要方式。一个简单的查询以query关键字开头,后面跟着查询的名称(可以省略),然后是花括号包裹的要查询的字段。例如,查询所有文章的标题和作者:
    graphql">query {posts {titleauthor}
    }
    
    • 这个查询表示从服务器获取posts数据,并只返回每个posttitleauthor字段。
  2. 参数传递(Arguments)
    • 可以为查询的字段传递参数来获取更具体的数据。例如,查询一篇特定id的文章内容:
    graphql">query {post(id: "123") {titlecontent}
    }
    
    • 这里post字段接收一个id参数,服务器根据这个参数返回对应的文章数据。

(三)变更(Mutation)

  1. 定义和使用
    • 变更用于修改服务器端的数据,比如创建、更新或删除数据。和查询类似,变更以mutation关键字开头。例如,创建一篇新文章的变更操作:
    graphql">mutation {createPost(title: "新文章标题", content: "新文章内容", author: "作者名字") {idtitle}
    }
    
    • 这个mutation调用createPost操作,传递titlecontentauthor参数来创建一篇新文章,然后返回新文章的idtitle字段。
  2. 返回值和错误处理
    • 变更操作可以返回修改后的数据,方便客户端获取最新信息。如果操作过程中出现错误,GraphQL会将错误信息返回给客户端。例如,如果在创建文章时标题字段不能为空,而客户端没有提供标题,服务器会返回一个包含错误信息的响应,指出标题是必需的。

三、与RESTful API的对比

(一)数据获取的灵活性

  1. 过度获取和不足获取问题的解决
    • 在RESTful API中,客户端通常只能获取服务器预先定义好的资源端点的数据。这可能导致过度获取(获取了比实际需要更多的数据)或不足获取(无法获取所需的全部数据)的问题。例如,在一个RESTful API中,获取文章列表的端点可能会返回文章的所有信息,包括标题、内容、作者、评论等,但客户端可能只需要标题和作者信息。
    • GraphQL允许客户端精确地指定需要的数据。客户端可以根据自己的需求构建查询,只获取所需的字段,避免了过度获取。同时,如果需要更多的数据,也可以在查询中添加相应的字段,解决了不足获取的问题。
  2. 关联数据查询的便利性
    • RESTful API在查询关联数据时可能比较复杂。例如,查询一篇文章及其作者的信息可能需要多次请求(先获取文章,再根据文章中的作者ID获取作者信息)。
    • 在GraphQL中,可以在一次查询中获取关联数据。例如,查询文章及其作者的信息可以这样写:
    graphql">query {post(id: "123") {titlecontentauthor {namebio}}
    }
    
    • 这样就可以在一次请求中获取文章的详细信息以及作者的姓名和简介。

(二)版本控制

  1. GraphQL的自我描述性与版本控制优势
    • RESTful API通常需要通过版本号来管理API的更新。当API的接口发生变化时,可能需要发布一个新的版本,这会导致维护成本增加。
    • GraphQL的类型系统具有自我描述性。客户端可以通过查询GraphQL服务器的类型定义(例如,使用__schema查询)来了解API的结构。当API发生变化时,只要类型系统的变化是向后兼容的(例如,添加新的字段或类型),客户端通常不需要进行修改。这种方式减少了对严格版本控制的依赖,降低了维护成本。

四、GraphQL的生态系统

(一)服务器实现

  1. Apollo Server
    • Apollo Server是GraphQL服务器实现中最受欢迎的之一。它支持多种编程语言和平台,如Node.js、Python、Java等。Apollo Server提供了许多高级功能,如缓存、订阅、错误处理等。在Node.js中使用Apollo Server的基本示例如下:
    const { ApolloServer, gql } = require('apollo - server');
    const typeDefs = gql`type Query {hello: String}
    `;
    const resolvers = {Query: {hello: () => 'Hello, GraphQL!'}
    };
    const server = new ApolloServer({ typeDefs, resolvers });
    server.listen().then(({ url }) => {console.log(`Server running at ${url}`);
    });
    
    • 这个示例定义了一个简单的Query类型,包含一个hello字段,当查询这个字段时,服务器返回Hello, GraphQL!
  2. 其他服务器实现
    • 除了Apollo Server,还有其他的GraphQL服务器实现,如GraphQL - Yoga(基于Node.js的轻量级服务器)、GraphQL - Java(用于Java环境)等。这些服务器实现都有各自的特点和适用场景,开发者可以根据自己的需求和编程语言选择合适的服务器。

(二)客户端库

  1. Apollo Client
    • Apollo Client是与Apollo Server配合使用的强大客户端库。它提供了缓存管理、数据预取、自动更新等功能。在React应用中使用Apollo Client的基本示例如下:
    import React from 'react';
    import { ApolloClient, InMemoryCache, ApolloProvider, gql, useQuery } from '@apollo/client';
    const client = new ApolloClient({uri: 'http://localhost:4000/',cache: new InMemoryCache()
    });
    const GET_HELLO = gql`query {hello}
    `;
    function Hello() {const { loading, error, data } = useQuery(GET_HELLO);if (loading) return <p>Loading...</p>;if (error) return <p>Error :(</p>;return <p>{data.hello}</p>;
    }
    function App() {return (<ApolloProvider client={client}><Hello /></ApolloProvider>);
    }
    export default App;
    
    • 这个示例在React应用中使用Apollo Client来查询hello字段,并在页面上显示查询结果。
  2. 其他客户端库
    • 还有其他一些GraphQL客户端库,如Relay(由Facebook开发,主要用于大型React应用)、urql(轻量级的JavaScript客户端库)等。这些客户端库为不同的开发场景和框架提供了支持,帮助开发者更方便地在客户端使用GraphQL。

五、应用场景

(一)移动应用开发

  1. 高效的数据获取与网络优化
    • 在移动应用中,网络带宽和设备性能是有限的。GraphQL的灵活性允许移动应用只获取所需的数据,减少了数据传输量,提高了网络效率。例如,在一个新闻移动应用中,当用户在文章列表页面时,只需要获取文章的标题、摘要和发布时间等基本信息;当用户打开具体文章时,再获取文章的详细内容和评论等信息。
  2. 适应不同屏幕尺寸和功能需求
    • 不同的移动设备有不同的屏幕尺寸和功能需求。GraphQL可以根据设备的具体情况提供不同的数据。例如,在一个具有社交功能的移动应用中,在大屏幕设备上可以查询更多的用户信息和社交动态,而在小屏幕设备上可以只获取关键信息,以适应有限的屏幕空间。

(二)微服务架构

  1. 统一的API网关和数据聚合
    • 在微服务架构中,可能有多个微服务提供不同的数据和功能。GraphQL可以作为API网关,将多个微服务的数据进行聚合和整合。例如,一个电商系统可能有用户服务、产品服务和订单服务等微服务。通过GraphQL,可以在一个查询中获取用户的订单信息以及订单中的产品信息,实现跨微服务的数据查询。
  2. 版本管理和服务演进
    • 微服务可能会频繁地更新和演进。GraphQL的类型系统和灵活的数据查询方式可以帮助管理微服务之间的接口变化。当一个微服务更新了接口,只要类型系统的变化是向后兼容的,其他依赖它的微服务或客户端通常不需要进行大量的修改,降低了微服务之间的耦合度和维护成本。

六、总结

GraphQL作为一种创新的API查询语言和运行时环境,通过其强大的类型系统、灵活的数据查询和变更操作,为现代应用开发带来了诸多优势。与传统的RESTful API相比,它在数据获取的灵活性、版本控制等方面表现出色,并且拥有丰富的生态系统,包括服务器实现和客户端库。在移动应用开发、微服务架构等众多应用场景中,GraphQL能够提高开发效率、优化网络性能和降低维护成本,是一种值得深入研究和应用的技术。


http://www.ppmy.cn/devtools/150156.html

相关文章

[c#] 度分秒和度的转换

一、度分秒转换为度 概念理解 在度分秒表示法中&#xff0c;1度 60分&#xff0c;1分 60秒。例如&#xff0c;一个角度表示为1030′15″&#xff0c;这里的10是度&#xff0c;30是分&#xff0c;15是秒。转换公式及代码示例 转换公式为&#xff1a;度分/60秒/3600。以下是一…

Spring Boot中的依赖注入是如何工作

Spring Boot 中的依赖注入&#xff08;Dependency Injection&#xff0c;简称 DI&#xff09;是通过 Spring 框架的核心机制——控制反转&#xff08;Inversion of Control&#xff0c;IOC&#xff09;容器来实现的。Spring Boot 基于 Spring Framework&#xff0c;在应用中自动…

AI开发 - 算法基础 递归 的概念和入门(三)递归的进阶学习

前面我们通过2篇文章&#xff0c;一起了解了 递归&#xff0c;以及使用递归来解决汉诺塔问题。今天我们在这个基础上&#xff0c;进一步地熟悉和学习递归。 这篇学习笔记将涵盖递归的基本概念、应用、优化技巧、陷阱及与迭代的对比&#xff0c;并通过具体的 Python 代码示例和…

Github出现复杂问题 无法合并 分支冲突太多 如何复原

目录 问题再现 解决思路 当然我所指的是在 main 分支开一个新的分支 删除本地文件夹 重新克隆 开一个新分支 切换分支 下载远程分支 文件覆盖 合并到主分支 ​​​​​​​问题再现 太复杂了 无法更改 编译器现状 全部崩溃了 无法更改 即使创建一个新的分支也无济于…

Pytest-Bdd-Playwright 系列教程(完结篇):本框架的功能参数说明

Pytest-Bdd-Playwright 系列教程&#xff08;完结篇&#xff09;&#xff1a;本框架的功能参数说明 简介1. 浏览器设置2. 环境与设备配置3. 存储状态管理4. 测试用例筛选5. 并行与重试控制6. 报告生成与输出格式7. 其他功能附录&#xff1a;参数说明表 简介 本框架支持多种浏览…

从攻击视角探讨ChatGPT对网络安全的影响

ChatGPT是OpenAI 发布的基于人工智能的对话机器人&#xff0c;上线短短2个月活跃用户就突破了1亿&#xff0c;成为全球关注的焦点。ChatGPT可以自动化地处理对话&#xff0c;可以通过基于自然语言处理技术的模型、情景模型和语言模型来自动生成文章&#xff0c;甚至可以按照用户…

Kafka优势剖析-流处理集成

目录 1. Kafka Streams API 1.1 什么是 Kafka Streams API&#xff1f; 1.2 Kafka Streams 的工作原理 1.3 Kafka Streams 的优势 1.4 Kafka Streams 的典型应用场景 2. KSQL 2.1 什么是 KSQL&#xff1f; 2.2 KSQL 的工作原理 2.3 KSQL 的优势 Kafka 的流处理能力是其…

【数据库】四、数据库管理与维护

文章目录 四、数据库管理与维护1 安全性管理2 事务概述3 并发控制4 备份与恢复管理 四、数据库管理与维护 1 安全性管理 安全性管理是指保护数据库&#xff0c;以避免非法用户进行窃取数据、篡改数据、删除数据和破坏数据库结构等操作 三个级别认证&#xff1a; 服务器级别…