GraphQL:强大的API查询语言

在这里插入图片描述

🤍 前端开发工程师、技术日更博主、已过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(作者)等字段。定义如下:
    type Post {title: Stringcontent: Stringauthor: String
    }
    
    • 这里Post是对象类型,titlecontentauthor是该对象类型的字段,它们的数据类型分别为String
  2. 标量类型(Scalar Type)
    • 标量类型是GraphQL中的基本数据类型,包括StringIntFloatBooleanIDID类型通常用于唯一标识一个对象,比如数据库中的主键。这些标量类型不能再细分,是构建复杂类型的基础。
    • 例如,在上述Post对象类型中,titlecontent字段的类型是String,这就是标量类型的应用。
  3. 接口(Interface)和联合类型(Union Type)
    • 接口:接口用于定义一组必须实现的字段,不同的对象类型可以实现同一个接口。例如,在一个包含文章和视频的内容系统中,可以定义一个Content接口,要求实现idcreatedAt字段,然后PostVideo对象类型都可以实现这个接口。
    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
    union SearchResult = Post | Video
    

(二)查询(Query)

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

(三)变更(Mutation)

  1. 定义和使用
    • 变更用于修改服务器端的数据,比如创建、更新或删除数据。和查询类似,变更以mutation关键字开头。例如,创建一篇新文章的变更操作:
    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中,可以在一次查询中获取关联数据。例如,查询文章及其作者的信息可以这样写:
    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.mzph.cn/diannao/66514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

集合卡尔曼滤波ENKF的学习笔记

集合卡尔曼滤波ENKF的学习笔记 什么是数据同化&#xff1f;天气模型预测是25C&#xff08;这叫"背景场"&#xff09;&#xff0c;实际观测是23C&#xff08;这叫"观测值"&#xff09;&#xff0c;数据同化就是把这两个信息合理结合。 # 最简单的组合方式&…

Spring AI ectorStore

Spring AI中的VectorStore是一种用于存储和检索高维向量数据的数据库或存储解决方案&#xff0c;它在AI应用中扮演着至关重要的角色。以下是对Spring AI VectorStore的详细解析&#xff1a; 一、VectorStore的基本概念 定义&#xff1a;VectorStore特别适用于处理那些经过嵌入…

DeepSeek-V3 通俗详解:从诞生到优势,以及与 GPT-4o 的对比

1. DeepSeek 的前世今生 1.1 什么是 DeepSeek&#xff1f; DeepSeek 是一家专注于人工智能技术研发的公司&#xff0c;致力于打造高性能、低成本的 AI 模型。它的目标是让 AI 技术更加普惠&#xff0c;让更多人能够用上强大的 AI 工具。 1.2 DeepSeek-V3 的诞生 DeepSeek-V…

UI自动化测试保姆级教程--pytest详解(精简易懂)

欢迎来到啊妮莫的学习小屋 别让过去的悲伤&#xff0c;毁掉当下的快乐一《借东西的小人阿莉埃蒂》 简介 pytest是一个用于Python的测试框架, 支持简单的单元测试和复杂的功能测试. 和Python自带的UnitTest框架类似, 但是相比于UnitTest更加简洁, 效率更高. 特点 非常容易上手…

微信小程序实现长按录音,点击播放等功能,CSS实现语音录制动画效果

有一个需求需要在微信小程序上实现一个长按时进行语音录制&#xff0c;录制时间最大为60秒&#xff0c;录制完成后&#xff0c;可点击播放&#xff0c;播放时再次点击停止播放&#xff0c;可以反复录制&#xff0c;新录制的语音把之前的语音覆盖掉&#xff0c;也可以主动长按删…

Clojure语言的数据库编程

Clojure语言的数据库编程 引言 在当今社会&#xff0c;数据的处理和管理已经成为一个不可或缺的部分。无论是互联网应用、企业系统还是移动应用&#xff0c;都需要与数据库进行频繁的交互。因此&#xff0c;选择一种合适的编程语言和相应的库来进行数据库编程显得尤为重要。C…

Javascript算法——贪心算法(一)

贪心算法详解&#xff08;JavaScript&#xff09;&#xff08;局部最优->全局最优&#xff09; 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取当前状态下的最优选择&#xff08;局部最优&#xff09;的算法设计方法。通过局部最优解的累积&…

[读书日志]从零开始学习Chisel 第九篇:Scala的内建控制结构(敏捷硬件开发语言Chisel与数字系统设计)

6.Scala的内建控制结构 6.1 if表达式 和大部分编程语言的if表达式使用上没有区别&#xff0c;单句话不需要加花括号&#xff0c;多个语句需要加花括号&#xff0c;直接来看一段代码&#xff1a; scala> def whichInt(x:Int) {| if(x 0) "Zero"| else if(x &g…

AI大模型-提示工程学习笔记5

卷首语&#xff1a;我所知的是我自己非常无知&#xff0c;所以我要不断学习。 写给AI入行比较晚的小白们&#xff08;比如我自己&#xff09;看的&#xff0c;大神可以直接路过无视了。 零提示是什么 “零提示”&#xff08;Zero-shot&#xff09;是指在没有提供任何特定示例…

全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(while循环应用)

在 C 编程的世界里&#xff0c;循环结构是掌控程序流程的关键工具之一&#xff0c;而while循环更是其中的经典。它就像一个不知疲倦的小卫士&#xff0c;只要条件满足&#xff0c;就会持续执行特定的代码块&#xff0c;可以解决诸多复杂的编程任务。本文就一同深入探索while循环…

CK18——肝损伤无创诊断标志物

肝脏作为人体至关重要的代谢与解毒器官&#xff0c;极易遭受病毒、药物、酒精及不良饮食等多种因素的损害&#xff0c;进而引发一系列如非酒精性脂肪肝&#xff08;NAFLD&#xff09;、肝纤维化、肝硬化、肝细胞癌以及各类肝炎等病症。因此&#xff0c;确定一种高可靠性、非侵入…

.NET Core + Kafka 开发指南

什么是Kafka Apache Kafka是一个分布式流处理平台,由LinkedIn开发并开源,后来成为Apache软件基金会的顶级项目。Kafka主要用于构建实时数据管道和流式应用程序。 Kafka 架构 从下面3张架构图中可以看出Kafka Server 实际扮演的是Broker的角色, 一个Kafka Cluster由多个Bro…

软件体系结构与设计模式

在软件开发中&#xff0c;软件体系结构和设计模式是两个至关重要的概念。它们帮助开发者设计出易于理解、可扩展、可维护的系统。尽管这两个概念密切相关&#xff0c;但它们分别关注系统的不同方面&#xff1a;软件体系结构关注的是系统整体结构的设计&#xff0c;而设计模式则…

[离线数仓] 总结二、Hive数仓分层开发

接 [离线数仓] 总结一、数据采集 5.8 数仓开发之ODS层 ODS层的设计要点如下: (1)ODS层的表结构设计依托于从业务系统同步过来的数据结构。 (2)ODS层要保存全部历史数据,故其压缩格式应选择压缩比率,较高的,此处选择gzip。 CompressedStorage - Apache Hive - Apac…

Unity3D仿星露谷物语开发19之库存栏丢弃及交互道具

1、目标 从库存栏中把道具拖到游戏场景中&#xff0c;库存栏中道具数相应做减法或者删除道具。同时在库存栏中可以交换两个道具的位置。 2、UIInventorySlot设置Raycast属性 在UIInventorySlot中&#xff0c;我们只希望最外层的UIInventorySlot响应Raycast&#xff0c;他下面…

阿里云代理商热销产品推荐

在数字化浪潮的推动下&#xff0c;企业对于云计算的依赖日益加深。阿里云&#xff0c;作为中国领先的云计算服务提供商&#xff0c;为企业提供了丰富多样的云产品和服务。本文将聚焦于阿里云代理商热销产品推荐&#xff0c;探讨其如何帮助企业高效利用云资源&#xff0c;加速数…

Python入门教程 —— 多任务

1.线程 1.1.线程安全问题 线程访问全局变量 import threading g_num = 0 def test(n):global g_numfor x in range(n):g_num += xg_num -= xprint(g_num)if __name__ == __main__:t1 = threading.Thread(target=test, args=(10,))t2 = threading.Thread(target=test, args=(…

江科大STM32入门——IIC通信笔记总结

wx&#xff1a;嵌入式工程师成长日记 &#xff08;一&#xff09;简介 STM32内部集成了硬件I2C收发电路&#xff0c;可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能&#xff0c;减轻CPU的负担 支持多主机 支持7位/10位地址模式 支持不同的通讯速…

vue3 vite 动态加载路由遇到的问题

记录一下动态加载路由遇到的问题 正常使用import引入静态路由是没问题的 component: () > import(/components/ExampleComponent.vue)动态引入的时候写成import就不行了 由于后端给的路由格式比较反人类…我这边先递归把获取到的数据格式做了一个整合. const processedDa…

MySQL安装,配置教程

一、Linux在线yum仓库安装 打开MySQL官方首页&#xff0c;链接为&#xff1a;https://www.mysql.com/ 界面如下&#xff1a; 在该页面中找到【DOWNOADS】选项卡&#xff0c;点击进入下载页面。 在下载界面中&#xff0c;可以看到不同版本的下载链接&#xff0c;这里选择【My…