GraphQL:简介

                                                                        GraphQL 图片来源: 

我们将探索GraphQL 的基础知识,并学习如何使用Apollo将其与 React 和 React Native 等前端框架连接起来。这将帮助您了解如何使用 GraphQL、React、React Native 和 Apollo 构建现代、高效的应用程序。

什么是 GraphQL?

GraphQL 是一种API 查询语言。它由 Facebook 开发,作为一种更有效地获取数据的解决方案。

为什么选择 GraphQL?

GraphQL 之前

  • REST API(表述性状态转移应用程序编程接口)是一种允许不同软件系统进行通信的标准化方式。

在 REST API 中,每个端点都会返回特定的 JSON 数据负载。即使我们只需要某些字段,它也会在每个请求中返回所有内容。

检索产品列表

  • HTTP 方法: GET
  • 端点(Endpoint): /api/products
  • 描述:检索所有产品的列表。

Request:

GET /api/products/1

Response:

[{"id": 1,"name": "Laptop","price": 999.99,"category": "Electronics","description": "A high-performance laptop suitable for all your computing needs.","manufacturer": "TechCorp","stock": {"quantity": 50,"warehouseLocation": "Warehouse A"},"specifications": {"processor": "Intel Core i7","ram": "16GB","storage": "512GB SSD","screenSize": "15.6 inches"},"images": ["https://example.com/images/laptop1.jpg","https://example.com/images/laptop2.jpg"],"ratings": {"average": 4.5,"count": 120},"reviews": [{"userId": 101,"rating": 5,"comment": "Excellent laptop for work and play.","date": "2023-06-15"},{"userId": 102,"rating": 4,"comment": "Great performance but a bit pricey.","date": "2023-06-20"}]},{"id": 2,"name": "Smartphone","price": 599.99,"category": "Electronics","description": "A sleek and powerful smartphone with the latest features.","manufacturer": "PhoneInc","stock": {"quantity": 200,"warehouseLocation": "Warehouse B"},"specifications": {"processor": "Snapdragon 888","ram

此外,REST API 的设计可能要求应用程序发出大量不必要的请求,因为某些数据可能来自不同的端点。

这意味着,为了检索有关特定数据,您需要发出不同的 HTTP 请求。

随着用户对更快、更高效的应用程序的需求不断增长,Facebook 认识到 REST API 中的这些问题。

2012 年,该公司开始内部开发 GraphQL,并于 2015 年向公众发布

GraphQL 如何工作?

如上所述;它是一种查询语言,这意味着它仅使用查询获取您需要的数据。

使用 GraphQL :

  • 只需管理较少的端点/graphql
  • 灵活地与数据库、REST API、云服务和 JSON 文件集成

典型的 GraphQL 操作如下:

  1. 通过查询从 GraphQL 服务器请求数据。
  2. 在 GraphQL 服务器上调用一个函数来从适当的源获取数据。
  3. GraphQL 服务器向客户端返回响应。

GraphQL 附带一个名为 GraphiQL 的 IDE,有助于开发人员测试 API。

Visual Studio 代码的 GraphQL 扩展

Visual Studio code的 GraphQL 扩展插件

GraphQL 的主要功能

声明式数据获取:客户端指定所需数据的形状和大小。避免过度获取(检索比所需更多的数据)和获取不足(检索比所需更少的数据)。

单一端点:与需要为不同资源设置多个端点的 REST 不同,GraphQL 使用单一端点来访问所有数据。

强类型模式:模式定义了可以查询的数据类型以及它们之间的关系。

订阅的实时数据:客户端可以订阅数据变化并实时接收更新。

GraphQL 查询的基本结构

这是一个用于获取产品的简单 GraphQL 查询:

通过 ID 获取单个产品:

GraphQL 查询

query {product(id: 1) {idnamepricecategorydescription}
}

 JSON 请求:

{"query": "query { product(id: 1) { id name price category description } }"
}

响应示例:

{"data": {"product": {"id": 1,"name": "Laptop","price": 999.99,"category": "Electronics","description": "A high-performance laptop suitable for all your computing needs."}}
}

添加新的、更新或产品(变更):

GraphQL 变更:

mutation {addProduct(input: {name: "Tablet",price: 299.99,category: "Electronics",description: "A lightweight tablet with a long battery life."}) {idnamepricecategorydescription}
}

JSON 请求:

{"query": "mutation { addProduct(input: { name: \"Tablet\", price: 299.99, category: \"Electronics\", description: \"A lightweight tablet with a long battery life.\" }) { id name price category description } }"
}

响应示例: 

{"data": {"addProduct": {"id": 3,"name": "Tablet","price": 299.99,"category": "Electronics","description": "A lightweight tablet with a long battery life."}}
}

更新 JSON 请求

{"query": "mutation { updateProduct(id: 1, input: { name: \"Laptop\", price: 1099.99, category: \"Electronics\", description: \"An updated high-performance laptop with additional features.\" }) { id name price category description } }"
}

 响应示例:

{"data": {"updateProduct": {"id": 1,"name": "Laptop","price": 1099.99,"category": "Electronics","description": "An updated high-performance laptop with additional features."}}
}

如何将 GraphQL 与 JSON 结合使用

定义模式:创建一个模式来定义 API 中可用的类型和字段。

设置服务器:使用 Apollo Server 或 Express GraphQL 等服务器库来处理请求。

发送查询/变异:使用 GraphiQL、Apollo Client 或 HTTP 客户端(例如 Postman、cURL)等工具以 JSON 格式发送查询和变异

处理响应:处理来自服务器的 JSON 响应,其中包括请求的数据或变异操作的确认。

GraphQL 能够处理复杂的查询并以 JSON 格式返回精确的数据,这使其成为传统 REST API 的强大替代品,能够实现更高效、更灵活的数据获取。

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

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

相关文章

春秋云境:CVE-2022-25411[漏洞复现]

根据题目提示和CNNVD优先寻找后台管理地址 靶机启动后,使用AWVS进行扫描查看网站结构 在这里可以看到后台管理的登录地址:/admin/,根据题目提示可知是弱口令 尝试admin、123456、admin666、admin123、admin888...等等常见弱口令 正确的账户…

Linux Vim最全面教程

Vim 是一款功能强大的文本编辑器,常用于 Linux 系统中。以下是一份 Vim 最全面教程: 三种模式: 命令模式:可以进行删除、复制、粘贴等快捷操作,按esc键可以返回到命令模式;编辑模式:可以编辑文件…

地理空间数据格式GeoJSON扫盲,在CesiumJS中如何加载。

Hi,我是贝格前端工场,GIS已经越来越多的应用在可视化大屏中了,开发GIS类应用就少不了地理空间数据,本文介绍一下数据GeoJSON数据格式。 一、什么是GeoJSON数据格式,在GIS开发中有什么作用 GeoJSON是一种基于JSON&…

【MySQL】数据库——备份与恢复,日志管理1

一、数据备份的重要性 1.备份的主要目的是灾难恢复 在生产环境中,数据的安全性至关重要 任何数据的丢失都可能产生严重的后果造成数据丢失的原因: 程序错误人为,操作错误运算错误磁盘故障灾难(如火灾、地震)和盗窃 2.数据库备份…

小窗口大魔力,实况窗服务实时掌控重要信息变化

移动互联网时代,各种以用户为中心的App如春笋般涌现,满足了用户在购物、导航、娱乐等不同场景下的需求,不同程度上丰富了用户的日常生活。然而,随着App种类的激增,用户在享受多样化服务的同时,也面临着多任…

26.4 Django 视图层

1. 视图函数 视图函数是Django框架中用于处理Web请求并返回Web响应的重要组件. 以下是对Django视图函数的详细解释: * 1. 视图函数与URL的映射.为了让Django能够知道哪个URL对应哪个视图函数, 需要在应用的urls.py文件中定义URL模式.使用path或re_path函数来定义URL模式, 并将…

Linux安装frp实现内网穿透

Linux运维工具-ywtool 目录 一. 简介二.代理类型三.frp支持的Linux的架构四.安装1.准备工作2.配置frp服务器端(a)下载安装包(b)解压安装包(c)修改配置文件(d)启动服务端 3.配置frp客户端(a)下载安装包并修改配置文件(b)启动客户端 4.测试连接 五.其他1.多端口穿透(a)服务端(b)客…

【AI】存储自定义色板库

点击左上角色板,弹出色板框; 色板框的左下角有一个“色板库” 菜单,点击色板库菜单,弹出色板库; 色板库弹窗的第一条数据【存储色板】,点击存储色板,出现自定义色板所在文件路径; 找…

vue如何把组件方法暴露到window对象中

vue如何把组件方法暴露到window对象中 场景:使用Vue开发电子地图功能,供客户端使用qtWebEngineView嵌入页面,客户端需要调用页面里定义的js方法实现相应功能。 问题:Vue组件内的方法,在外部调用不到。 原因&#xf…

线程的创建(一)

通过继承Thread类实现多线程 继承Thread类实现多线程的步骤: 在Java中复责实现线程功能的类是java.lang.Thread类。(此种方式的缺点:如果我们的类已经继承了一个类(如:小程序必须继承自 Appiet 类)&#x…

计算机毕业设计Thinkphp/Laravel校园体育器材管理系统

校园体育器材管理系统在流畅性,续航能力,等方方面面都有着很大的优势。这就意味着校园体育器材管理系统的设计可以比其他系统更为出色的能力,可以更高效的完成最新的体育器材、器材借用、器材归还、器材损坏、采购入库、器材报废、维修记录等…

产品(soc)研发量产流程介绍

硬件开发流程: 开始 ↓ 立项:经过市场调研、客户需求分析、可行性评估(技术,成本,时间)确定需要做的事情,制定初步产品定义和规格 ↓ 供应商导入:如果自身无工厂,需要与工厂联姻,一起合作“生产品” ↓ 产品设计与开发:将需求转化为图纸、规格,即“纸上谈兵…

linux 获得打开指定文件进程的PID和该进程的绝对路径 C语言

下面代码效果是查出哪个进程打开了指定文件,可以查出打开文件进程的PID以及该进程所在linux的绝对路径(只能查出一个,想得出全部的需要小改一下代码),并且可以自己选择是否kill掉这个进程 #include <stdio.h> #include <string.h> #include <stdlib.h>//执行…

Spring Boot整合RocketMQ实现延迟消息消费

导包 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.0.3</version></dependency>添加配置信息 application配置文件 # rocketMq地址 rocketmq.name…

Ubuntu+Apache2 搭建Gerrit 环境

一、前言 时隔多年&#xff0c;好久没有更新CSDN 博客了&#xff0c;主要原因有如下两点&#xff1a; 1、平时工作繁忙&#xff0c;无暇更新。 2、工作内容涉及信息安全&#xff0c;一些工作经验积累不便更新到互联网上。 最近一直在折腾搭建Gerrit 环境&#xff0c;最开始是…

基于Transformer的自监督学习在NLP中的前沿应用

1. 引言 自然语言处理&#xff08;NLP&#xff09;领域正经历一场由自监督学习&#xff08;Self-Supervised Learning, SSL&#xff09;和Transformer架构共同驱动的革命。自监督学习通过巧妙地利用未标注数据&#xff0c;大大减少了对人工标注的依赖&#xff0c;而Transforme…

基于IM948(Low-cost IMU+蓝牙)模块的高精度PDR(Pedestrian Dead Reckoning)定位系统 — 可以供模块和配套代码

一、背景与意义 行人PDR定位系统中的PDR&#xff08;Pedestrian Dead Reckoning&#xff0c;即行人航位推算&#xff09;背景意义在于其提供了一种在GPS信号不可用或不可靠的环境下&#xff0c;对行人进行精确定位和导航的解决方案。以下是关于PDR背景意义的详细描述&#xff1…

Nacos、Sentinel底层核心原理

Nacos和Sentinel都是服务于微服务架构的组件&#xff0c;但它们各自承担不同的角色和功能。 ### Nacos的核心原理&#xff1a; 1. **服务发现与注册中心**&#xff1a;Nacos作为服务注册中心&#xff0c;允许服务实例在启动时注册自己&#xff0c;并在关闭时注销。客户端可以通…

如何正确选择EC油封端盖?

在机械系统中&#xff0c;EC油封端盖扮演着关键角色。正确选择密封圈不仅能确保系统的正常运行&#xff0c;还能延长设备的使用寿命。本文将从多个角度探讨如何选择合适的EC油封端盖。 分析应用环境 操作环境&#xff1a; 温度范围&#xff1a;确定操作环境的温度范围。像FK…

超越常规:深度定制Ant Design Vue组件样式

标题&#xff1a;超越常规&#xff1a;深度定制Ant Design Vue组件样式 Ant Design Vue是一个基于Vue.js的UI设计语言&#xff0c;它提供了一套企业级的高质量React组件。尽管Ant Design Vue的组件已经非常完善&#xff0c;但在某些情况下&#xff0c;我们可能需要根据特定的设…