前端需要学GraphQL 吗?

什么是GraphQL?

GraphQL 是 Facebook 开发的一个数据查询语言,可以让前端开发者更具体地指定他们需要什么数据,从而使数据获取更加高效。GraphQL 是一种数据查询和操作语言,它主要被设计用来作为 API 的请求语言。与传统的 RESTful API 相比,GraphQL 的主要优势在于其灵活性,它允许客户端精确地描述他们需要什么样的数据,减少不必要的数据传输,提高 API 请求效率。

为什么需要GraphQL?

直接后端SQL查数据就好了吗,为什么需要这个东西???

我们从以下两个角度来看:

  1. 数据的有效性:在传统的 RESTful API 设计中,后端开发者通常会预先定义好一系列的 API 接口,用以获取不同的数据。然而,这种方式的问题在于,前端开发者只能选择请求哪个 API 接口,而不能决定获取的具体数据的结构。这就可能导致前端获取到很多不必要的数据,或者反过来,为了获取所需的所有数据,前端可能需要发送多次的 API 请求。而 GraphQL 则解决了这个问题,它允许前端通过编写查询语句精确地得到所需的数据,并减少了数据的传输量。
  2. 工作的高效性:在传统的开发模式中,后端开发者需要提前预定义并实现 API 接口,然后前端开发者根据这些端点来获取数据和开发前端应用。这就需要前后端开发者进行大量的沟通和协调,而且当需求变更时,可能需要后端重新修改和部署 API 端点。使用 GraphQL,只需要后端开发者提供 GraphQL 的 schema 和 resolver,前端开发者则可以自行编写查询语句,获取他们需要的数据,这样大大提高了开发效率。

在如今的前后端分离的开发模式中,GraphQL 不仅提供了一种灵活高效的数据查询方式,同时也给前后端开发者带来了更多的协作灵活性。前端开发者能够更自由、更精确地获取他们需要的数据,而后端开发者则能专注于如何更有效地处理和提供数据。

Golang如何实现?

在 Golang 中,我们可以使用 graphql-go/graphql 这个库来设置 GraphQL 服务器。下面是快速上手的一些主要步骤:

  1. 安装 graphql-go/graphql 库:
go get github.com/graphql-go/graphql
  1. 定义数据类型:

我们首先需要定义我们的数据类型。在 GraphQL 中,所有的东西都是类型,包括查询(query)和变更(mutation)。以下是一个简单的例子:

var userType = graphql.NewObject(graphql.ObjectConfig{Name: "User",Fields: graphql.Fields{"id": &graphql.Field{Type: graphql.String,},"name": &graphql.Field{Type: graphql.String,},},
})
  1. 定义 Query:

在 GraphQL 中,查询是用来读取数据的。你需要定义一个 RootQuery 来得到你需要的数据。

var queryType = graphql.NewObject(graphql.ObjectConfig{Name: "Query",Fields: graphql.Fields{"User": &graphql.Field{Type: userType,Args: graphql.FieldConfigArgument{"id": &graphql.ArgumentConfig{Type: graphql.String,},},Resolve: func(p graphql.ResolveParams) (interface{}, error) {// 这里写你获取 user 的逻辑,可以从数据库或者其他地方// p.Args["id"] 是客户端传来的 id 参数// 假设我们有一个 getUserByID 函数从数据库获取用户return getUserByID(p.Args["id"].(string)), nil},},},
})
  1. 创建 schema:

创建 schema,传入你的 root query:

schema, err := graphql.NewSchema(graphql.SchemaConfig{Query:    queryType,
})
if err != nil {log.Fatalf("failed to create new schema, error: %v", err)
}
  1. 创建一个 handler 来处理客户端的请求:
http.Handle("/graphql", &relay.Handler{Schema: graphql.Schema})
log.Fatal(http.ListenAndServe(":8080", nil))

至此,GraphQL 服务器就已经建立好了,可以通过 POST /graphql 来访问你的 API 了。查询的例子如下:

{"query": "{ user(id:"1") { name } }"
}

值得注意的是, 虽然 GraphQL 带来了诸多好处,但它并不是万能的。在某些情况下,例如 API 要提供一种简单统一的数据接入方式,或者你的应用的数据需求非常明确且变化不大时,传统的 RESTful API 也许会是更好的选择。总的来说,GraphQL 是作为 RESTful API 的一个有效补充,而不是替代品,开发者需要根据自己的具体需求来选择更适合的工具。

如果上面的内容对你有帮助,请点赞收藏哦,我会分享更多的经验。

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

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

相关文章

#前后端分离# 头条发布系统

头条业务简介 用户功能 注册功能登录功能jwt实现 新闻 新闻的分页浏览通过标题关键字搜索新闻查看新闻详情新闻的修改和删除 预览界面 开源上线 https://gitcode.net/NVG_Haru/NodeJS_5161447 数据库设计 数据库脚本 CREATE DATABASE sm_db;USE sm_db;SET NAMES utf8mb4…

半导体行业-SECS/GEM协议 JAVA与SECS/GEM通信 什么是配方?springboot集成SECS通信协议 配方管理S7FX

Java与SECS基础通信 Java实现SECS指令S2F17获取时间 Java实现SECS指令 S10F3 终端单个显示例子 Java实现SECS指令 S7FX配方管理 Java实现SECS指令 S5F1报警/取消报警上传 实例源码及DEMO请查阅 JAVA开发SECS快速入门资料,SECS S7F19 什么是半导体配方&…

C++ enum class 如何使用

enum class 是 C11 引入的一种新的枚举类型,它是对传统 C 风格的枚举的一种改进。enum class 提供了更强大的类型安全性和作用域限定。以下是关于 enum class 的详细介绍和用法说明: 1. 基本语法 enum class EnumName {Enumerator1,Enumerator2,// ...…

知识笔记(六十五)———css+js实现鼠标移动边框高亮效果

前言&#xff1a;效果是鼠标移入空白区域&#xff0c;边框高亮的效果。效果是在douyin的渡一教育袁老师的课程学习到的&#xff0c;观看以后是一个实用的小特效。想看的可以平台查询&#xff0c;自己也学到了知识。 <!DOCTYPE html> <html lang"en"> &l…

初识javaWeb

一、JavaWeb是什么&#xff1f; 1、概念 javaWeb指的是使用java语言进行互联网领域项目开发的技术栈——进行web项目开发所需的技术的集合。 -Web前端——在浏览器中用户可以看到的网页 -Web后端——为前端提供数据的程序 2、Web项目 java语言是可以进行多种类型的项目开发&a…

网大为卸任腾讯CXO;Midjourney 1 月训练视频模型;2023年马斯克赚了7700亿

投融资 • 2023 年大型科技公司在生成式 AI 初创企业上的投资远超风险投资集团• 恒信东方与无锡政府合作成立布局 MR/XR 技术及 3D 数字资产 AIGC 产业投资基金• 新公司法完善注册资本认缴登记制度• 网大为卸任腾讯CXO&#xff0c;曾促成南非MIH的投资• 宁波蔚孚科技完成数…

【VS】NETSDK1045 当前 .NET SDK 不支持将 .NET 6.0 设置为目标。

问题描述 报错 NETSDK1045 严重性代码说明项目文件行禁止显示状态错误NETSDK1045当前 .NET SDK 不支持将 .NET 6.0 设置为目标。请将 .NET 5.0 或更低版本设置为目标&#xff0c;或使用支持 .NET 6.0 的 .NET SDK 版本。RCSoftDrawMicrosoft.NET.TargetFrameworkInference.ta…

悟的数组匹配

题目&#xff1a; 描述 牛牛刚学会数组不久&#xff0c;他拿到两个数组 a 和 b&#xff0c;询问 b 的哪一段连续子数组之和与数组 a 之和最接近。 如果有多个子数组之和同样接近&#xff0c;输出起始点最靠左的数组。 输入描述&#xff1a; 第一行输入两个正整数 n 和 m &…

年度总结|存储随笔2023年度最受欢迎文章榜单TOP15-part2

TOP11&#xff1a;PCIe在狂飙&#xff0c;SAS存储之路还有多远&#xff1f; 随着科技的飞速发展&#xff0c;固态硬盘&#xff08;SSD&#xff09;已经成为现代计算机系统中不可或缺的一部分。它以其出色的性能和可靠性&#xff0c;改变了我们对于存储设备的期待。当前业内SSD广…

Java(算术,自增自减,赋值,关系,逻辑,三元)运算符,运算符的优先级,隐式转换,强制转换,字符串的+。

文章目录 1.运算符和表达式运算符&#xff1a;表达式&#xff1a; 2.算术运算符练习&#xff1a;数值拆分 3.隐式转换概念&#xff1a;简单记忆&#xff1a;两种提升规则&#xff1a;取值范围从小到大的关系&#xff1a; 4.隐式转换的练习案例一&#xff1a;案例二&#xff1a;…

Python中如何使用_new_实现单例模式

单例模式是一个经典设计模式&#xff0c;简要的说&#xff0c;一个类的单例模式就是它只能被实例化一次&#xff0c;实例变量在第一次实例化时就已经固定。 在Python中常见的单例模式有None&#xff0c;这就是一个很典型的设计&#xff0c;通常使用 if xxx is None或者if xxx …

【Linux Shell学习笔记】Linux Shell的位置参数与函数

一、位置参数 位置参数&#xff0c;也被称之为位置变量&#xff0c;通过位置参数&#xff0c;可以在执行程序的时候&#xff0c;向程序传递数据 1.1 shell接收参数的方法 1.2 向shell传递参数的方法 二、函数 2.1 函数基础 2.1.1 函数简介 函数本质上就是一个代码块&#xf…

微信小程序开发系列-07组件

微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》《微信小程序开发系列-02注册小程序》《微信小程序开发系列-03全局配置中的“window”和“tabBar”》《微信小程序开发系列-04获取用户图像和昵称》《微信小程序开发系列-05登录小程序》《微信小程序…

数据库的事务调度

调度 要求&#xff1a;一个事务中的操作相对顺序不能变。 以事务为单位&#xff0c;串行调度。 以操作为单位&#xff0c;并发调度。 并发调度的结果等于串行调度&#xff0c;那么并发调度是可串行化的&#xff0c;是正确的&#xff0c;是可以用来并发的。 并发级别以及其面临…

碎花连衣裙 I 森系女孩的衣橱

宛如来到了春天&#xff0c;身穿碎花连衣裙的少女 在充满阳光&#xff0c;树叶葱郁的森林里 自由快乐地穿梭&#xff0c;感受着春天的美好 感受着幸福而快乐的童年&#xff01;

10 款顶级的免费U盘数据恢复软件(2024 年 更新)

你曾经遇到过U盘无法访问的情况吗&#xff1f;现在我们教你如何恢复数据。 在信息时代&#xff0c;数据丢失往往会造成巨大的困扰。而USB闪存驱动器作为我们常用的数据存储设备&#xff0c;其重要性不言而喻。但是&#xff0c;U盘也可能会出现各种问题&#xff0c;如无法访问、…

清华开源ChatGPT自动编程ChatDev项目codes.py代码解读

这段代码定义了一个Codes类&#xff0c;这个类是用于管理生成的代码的类&#xff0c;它可以根据LLM的回复来提取、格式化、更新和保存代码。Codes类的__init__()方法是类的构造函数&#xff0c;它接受一个参数generated_content&#xff0c;表示LLM的回复内容。它首先初始化了以…

conftest.py 配置

章节目录&#xff1a; 一、概述二、场景说明三、代码示例3.1 最外层3.2 商品模块测试3.3 订单模块测试3.4 用户模块测试3.5 执行结果 四、关于 conftest.py 配置 fixture五、结束语 一、概述 “conftest.py” 是 pytest 测试框架中的一个特殊的配置文件&#xff0c;它能够为整个…

分布式技术之缓存技术

文章目录 什么是分布式缓存&#xff1f;分布式缓存原理Redis 分布缓存原理Memcached 分布式缓存原理对比分析 在计算机领域的各个方面&#xff0c;缓存都非常重要&#xff0c;是提升访问性能的一个重要技术。为什么这么说呢&#xff1f;从单个计算机的体系结构来看&#xff0c;…