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: String
        content: String
        author: String
    }
    
    • 这里Post是对象类型,titlecontentauthor是该对象类型的字段,它们的数据类型分别为String
  2. 标量类型(Scalar Type)
    • 标量类型是GraphQL中的基本数据类型,包括StringIntFloatBooleanIDID类型通常用于唯一标识一个对象,比如数据库中的主键。这些标量类型不能再细分,是构建复杂类型的基础。
    • 例如,在上述Post对象类型中,titlecontent字段的类型是String,这就是标量类型的应用。
  3. 接口(Interface)和联合类型(Union Type)
    • 接口:接口用于定义一组必须实现的字段,不同的对象类型可以实现同一个接口。例如,在一个包含文章和视频的内容系统中,可以定义一个Content接口,要求实现idcreatedAt字段,然后PostVideo对象类型都可以实现这个接口。
    interface Content {
        id: ID
        createdAt: String
    }
    type Post implements Content {
        id: ID
        createdAt: String
        title: String
        content: String
        author: String
    }
    type Video implements Content {
        id: ID
        createdAt: String
        url: String
        duration: Int
    }
    
    • 联合类型:联合类型表示可以是多种对象类型中的一种。例如,定义一个SearchResult联合类型,它可以是Post或者Video
    union SearchResult = Post | Video
    

(二)查询(Query)

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

(三)变更(Mutation)

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

三、与RESTful API的对比

(一)数据获取的灵活性

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

(二)版本控制

  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能够提高开发效率、优化网络性能和降低维护成本,是一种值得深入研究和应用的技术。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950958.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue js实现时钟以及刻度效果

2025.01.08今天我学习如何用js实现时钟样式&#xff0c;效果如下&#xff1a; 一、html代码如下&#xff1a; <template><!--圆圈--><div class"notice_border"><div class"notice_position notice_name_class" v-for"item in …

Docker入门之docker基本命令

Docker入门之docker基本命令 官方网站&#xff1a;https://www.docker.com/ 1. 拉取官方镜像并创建容器&#xff08;以redis为例&#xff09; 拉取官方镜像 docker pull redis# 如果不需要添加到自定义网络使用这个命令&#xff0c;如需要&#xff0c;直接看第二步 docker r…

“深入浅出”系列之FFmpeg:(1)音视频开发基础

我的音视频开发大部分内容是跟着雷霄骅大佬学习的&#xff0c;所以笔记也是跟雷老师的博客写的。 一、音视频相关的基础知识 首先播放一个视频文件的流程如下所示&#xff1a; FFmpeg的作用就是将H.264格式的数据转换成YUV格式的数据&#xff0c;然后SDL将YUV显示到电脑屏幕上…

【JAVA基础】Collections方法的具体使用方法

java基础中Collections及collect(toList,toSet,toMap)的用法 package com.gaofeng;import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream;public class demo01 {public static void main(String[] …

深度学习知识点:RNN

文章目录 1.简单介绍2.网络结构3.应对梯度消失 1.简单介绍 循环神经网络&#xff08;RNN&#xff0c;Recurrent Neural Network&#xff09;是一类用于处理序列数据的神经网络。与传统网络相比&#xff0c;变化不是特别大&#xff0c;不如CNN的变化那么大。 为什么要有循环神经…

超完整Docker学习记录,Docker常用命令详解

前言 关于国内拉取不到docker镜像的问题&#xff0c;可以利用Github Action将需要的镜像转存到阿里云私有仓库&#xff0c;然后再通过阿里云私有仓库去拉取就可以了。 参考项目地址&#xff1a;使用Github Action将国外的Docker镜像转存到阿里云私有仓库 一、Docker简介 Do…

MySQL学习笔记(二)

一、SQL-函数 函数-介绍 函数是指一段可以直接被另一段程序调用的程序或代码。 字符串函数 示例 --concat select concat(Hello,MySql); --upper select upper(Hello); --lpad select lpad(01,5,-); --trim select trim( Hello MySQL ); --中间空格还在&#xff0c;头尾…

java mail 535 Login Fail. Please enter your authorization code to login

报错信息提示查看 https://service.mail.qq.com/detail/0/53 帮助页面意思就是说你要使用授权码登录, 但是授权码我已经正确的设置上去了 后面从 QQ邮箱出现错误 Please enter your authorization code to_邮件群发-双翼邮件群发软件官方网 看到 账户 需要是 QQ号 例如…

mysql、postgresql、druid链接池踩坑记录

The last packet successfully received from the server wIs 10,010 milliseconds ago. The last packet sent successfully to the server was 10,010 milliseconds ago.### The error may exist in URL mysql 链接字符串没有 &connectTimeout600000&socketTimeout6…

安卓NDK视觉开发——手机拍照文档边缘检测实现方法与库封装

一、项目创建 创建NDK项目有两种方式&#xff0c;一种从新创建整个项目&#xff0c;一个在创建好的项目添加NDK接口。 1.创建NDK项目 创建 一个Native C项目&#xff1a; 选择包名、API版本与算法交互的语言&#xff1a; 选择C版本&#xff1a; 创建完之后&#xff0c;可…

Spring Boot教程之五十二:CrudRepository 和 JpaRepository 之间的区别

Spring Boot – CrudRepository 和 JpaRepository 之间的区别 Spring Boot建立在 Spring 之上&#xff0c;包含 Spring 的所有功能。由于其快速的生产就绪环境&#xff0c;使开发人员能够直接专注于逻辑&#xff0c;而不必费力配置和设置&#xff0c;因此如今它正成为开发人员…

【网页自动化】篡改猴入门教程

安装篡改猴 打开浏览器扩展商店&#xff08;Edge、Chrome、Firefox 等&#xff09;。搜索 Tampermonkey 并安装。 如图安装后&#xff0c;浏览器右上角会显示一个带有猴子图标的按钮。 创建用户脚本 已进入篡改猴管理面板点击创建 脚本注释说明 name&#xff1a;脚本名称。…

spark汇总

目录 描述运行模式1. Windows模式代码示例 2. Local模式3. Standalone模式 RDD描述特性RDD创建代码示例&#xff08;并行化创建&#xff09;代码示例&#xff08;读取外部数据&#xff09;代码示例&#xff08;读取目录下的所有文件&#xff09; 算子DAGSparkSQLSparkStreaming…

Spring AMQP-保证发送者消息的可靠性

1. 消息发送者的可靠性 保证消息的可靠性可以通过发送者重连和发送者确认来实现 发送者重连 发送者重连机制就是在发送信息的时候如果连接不上mq不会立即结束&#xff0c;而是会在一定的时间间隔之类进行重新连接&#xff0c;连接的次数和时间都是由我们在配置文件中指定的&…

vs2022编译webrtc步骤

1、主要步骤说明 概述&#xff1a;基础环境必须有&#xff0c;比如git&#xff0c;Powershell这些&#xff0c;就不写到下面了。 1.1 安装vs2022 1、选择使用C的桌面开发 2、 Windows 10 SDK安装10.0.20348.0 3、勾选MFC及ATL这两项 4、 安装完VS2022后&#xff0c;必须安…

UnityWebGl:打包成webgl后UGUI不显示文字(中文)问题

是由于unity默认使用的是Arial,导致打包成webgl时中文不显示 解决方案&#xff1a; 可在电脑C盘下&#xff0c;路径为C:\Windows\Fonts 找个中文简体的字体文件放到unity里面&#xff0c;格式必须为. ttf

ffmpeg-avio实战:打开本地文件或者网络直播流dome

使用ffmpeg打开打开本地文件或者网络直播流的一个小dome。流程产靠ffmpeg4.x系列的解码流程-CSDN博客 #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libavformat/avio.h> #include <libavutil/file.h> #include &l…

英伟达打造个人 AI 超级计算机:Project DIGITS 震撼登场

手掌大小的超级计算机 Nvidia 在 CES 2025 上为桌面用户推出了 一款大小和手掌差不多的超级计算机——Project DIGITS AI 超级计算机。虽然它的大小和一个手掌差不多&#xff0c;但性能方面可以说是强到惊人。 Project DIGITS Project DIGITS Project DIGITS 搭载全新的 GB10 G…

SAP SD学习笔记26 - 贩卖契约(框架协议)的概要,基本契约 - 数量契约

上一章讲了品目阶层&#xff08;产品层次结构&#xff09;&#xff0c;品揃Module(分类模块) 。 SAP SD学习笔记25 - 品目阶层&#xff08;产品层次结构&#xff09;、品揃Module&#xff08;分类模块&#xff09;-CSDN博客 本章继续讲SAP的知识&#xff1a;贩卖契约&#xff…

ESP32 IDF VScode出现头文件“无法打开 源 文件 ”,并有红色下划线警告

问题背景&#xff1a; ESP32 IDF VScode出现头文件“无法打开 源 文件 ”&#xff0c;并有红色下划线警告&#xff1a; 解决办法&#xff1a; 在工程里面的.vscode文件夹下&#xff0c;检查是否存在c_cpp_properties.json文件&#xff0c;如果没有可以手动创建添加。如图…