GraphQL是什么?

一种用于 API 的查询语言,GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。

GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。

GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

关于SQL

SQL 指结构化查询语言,全称是 Structured Query Language。

在您的网站中使用 SQL,比如要创建一个显示数据库中数据的网站,您需要:

1、RDBMS 数据库程序(比如 MS Access、SQL Server、MySQL)
2、使用服务器端脚本语言,(比如 PHP 、 ASP、Node)
3、使用 SQL 来获取您想要的数据
4、使用 HTML / CSS

如何使用

GraphQL 是一种描述客户端如何向服务端请求数据的API语法,类似于 RESTful API 规范。

客户端可以通过 HTTP GET 发送请求,请求的结构如下所示:

http://myapi/graphql?query={me{name}}

然后你的 GraphQL HTTP 服务器应当能够处理 HTTP GET 方法。

// server.js
const express = require('express')
const { graphqlHTTP } = require('express-graphql')
const schema = require('./schema')
const cors = require('cors')const app = express()
app.use(cors({origin: 'http://localhost:3000',methods: 'GET,POST,OPTIONS,DELETE,PUT'
}))
app.use('/graphql', graphqlHTTP({schema,graphiql: true
}))
app.listen(4000, () => {console.log('服务器启动:http://localhost:4000')
})

express-graphql 的 npm 包是用来创建一个 GraphQL HTTP 服务。用它结合常规 Express 来运行 GraphQL,作用是处理请求然后返回数据。

graphql 的 npm 包是 GraphQL 规范的语法实现,用于在 Node.js 环境中运行。GraphQL API 基于类型和字段的方式进行组织。所以这个包的作用定义类型和字段提供 API 方法。

// schema.js
const graphql = require('graphql')
const { GraphQLObjectType, GraphQLString, GraphQLSchema, GraphQLList, GraphQLNonNull } = graphqlconst User = new GraphQLObjectType({name: 'User',fields: () => ({id: { type: GraphQLString },name: { type: GraphQLString }})
})const UserInfo = { id: "1", name: "张三" }const RootQuery = new GraphQLObjectType({name: 'RootQuery',fields: {me: {type: User,args: {// 参数},resolve (parent, args) {return UserInfo}}}
})module.exports = new GraphQLSchema({query: RootQuery
})

然后启动服务,当我们访问 http://localhost:4000/graphql?query={me{name}} 页面会查询出下面结果:

{"data": {"me": {"name": "张三"}}
}

GraphQL 主要是作用于数据接口,比如前端后端交互。客户端自由筛选去获取服务端事先定义好的数据,提高了交互接口的灵活性。比如上述接口,只有 name 字段,现在我又想访问 id 字段,只需要在接口请求的时候带上你要获取那些字段就可以。

http://localhost:4000/graphql?query={me{name,id}}

向你的 API 发出一个 GraphQL 请求就能准确获得你想要的数据,不多不少。 GraphQL 查询总是返回可预测的结果。使用 GraphQL 的应用可以工作得又快又稳,因为控制数据的是我们的应用,而不是服务器。

GraphQL 查询不仅能够获得资源的属性,还能沿着资源间引用进一步查询。典型的 REST API 请求多个资源时得载入多个 URL,而 GraphQL 可以通过一次请求就获取你应用所需的所有数据。这样一来,即使是比较慢的移动网络连接下,使用 GraphQL 的应用也能表现得足够迅速。

const graphql = require('graphql')
const { GraphQLObjectType, GraphQLString, GraphQLSchema, GraphQLList, GraphQLNonNull } = graphqlconst categories = [{ id: '1', name: '图书' },{ id: '2', name: '手机' },{ id: '3', name: '面包' },{ id: '4', name: '电脑' },
]// products.category 对应的是 categories.id 表示分类id
const products = [{ id: '1', name: '深入浅出nodeJS', category: '1' },{ id: '2', name: '高级程序设计', category: '1' },{ id: '3', name: '华为手机', category: '2' },{ id: '2', name: 'mac电脑', category: '4' },
]const Category = new GraphQLObjectType({name: 'Category',fields: () => ({id: { type: GraphQLString },name: { type: GraphQLString },products: {type: new GraphQLList(Product),resolve (parent) {// parent是当前分类,根据分类找到对应的产品列表return products.filter(item => item.category === parent.id)}}})
})const Product = new GraphQLObjectType({name: 'Product',fields: () => ({id: { type: GraphQLString },name: { type: GraphQLString },category: {type: Category,resolve (parent) {// category: '1' 根据分类的id找到分类对应的对象return categories.find(item => item.id === parent.category)}}})
})// 定义根类型
const RootQuery = new GraphQLObjectType({name: 'RootQuery',fields: {// 根据ID查询分类getCategory: {type: Category,args: {id: { type: GraphQLString },},resolve (parent, args) {return categories.find((item) => item.id === args.id)}},// 查询所有分类getCategoryList: {type: new GraphQLList(Category),args: {},resolve (parent, args) {return categories}},// 根据ID查询产品getProduct: {type: Product,args: {id: { type: GraphQLString },},resolve (parent, args) {return products.find((item) => item.id === args.id)}},// 查询所有产品getProductList: {type: new GraphQLList(Product),args: {},resolve (parent, args) {return products}}}
})module.exports = new GraphQLSchema({query: RootQuery
})

一个分类下面是有多个产品,这种一对多的关系。当我们查询分类的时候,还能查出具体分类里面的产品列表,这种关联关系就是沿着资源间引用进一步查询的特点。

关于graphql快速入门相关推荐

  1. ibm cloud怎么使用_使用VueJS,FeathersJS和GraphQL快速入门IBM Cloud

    ibm cloud怎么使用 by Thomas Reinecke 由托马斯·雷内克(Thomas Reinecke) 使用VueJS,FeathersJS和GraphQL快速入门IBM Cloud ( ...

  2. 关于 GraphQL 快速入门

    GraphQL是什么? 一种用于 API 的查询语言,GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时. GraphQL 对你的 API 中的数据提供了一套易于理解的完整 ...

  3. NoSQL(MongoDB) + GraphQL 快速入门环境和资料

    如果你想了解NoSQL DB和GraphQL,推荐一个非常好的资料.依照文档里边的步骤,在Atlas上免费搭建一个使用到MongoDB和GraphQL的web app项目.详细的搭建步骤来自Mongo ...

  4. Shiro第一个程序:官方快速入门程序Qucickstart详解教程

    目录 一.下载解压 二.第一个Shiro程序 1. 导入依赖 2. 配置shiro配置文件 3. Quickstart.java 4. 启动测试 三.shiro.ini分析 四.Quickstart. ...

  5. 计算机入门新人必学,异世修真人怎么玩?新手快速入门必备技巧

    异世修真人怎么快速入门?最近新出来的一款文字修仙游戏,很多萌新不知道怎么玩?进小编给大家带来了游戏新手快速入门技巧攻略,希望可以帮到大家. 新手快速入门攻略 1.开局出来往下找婆婆,交互给点钱,旁边有 ...

  6. Spring Boot 2 快速教程:WebFlux 快速入门(二)

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘 ...

  7. Apache Hive 快速入门 (CentOS 7.3 + Hadoop-2.8 + Hive-2.1.1)

    2019独角兽企业重金招聘Python工程师标准>>> 本文节选自<Netkiller Database 手札> 第 63 章 Apache Hive 目录 63.1. ...

  8. 《iOS9开发快速入门》——导读

    本节书摘来自异步社区<iOS9开发快速入门>一书中的目录,作者 刘丽霞 , 邱晓华,更多章节内容可以访问云栖社区"异步社区"公众号查看 目 录 前 言 第1章 iOS ...

  9. BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序

    BIML 101 - BIML 快速入门教程 做大数据的项目,最花时间的就是数据清洗. 没有一个相对可靠的数据,数据分析就是无木之舟,无水之源. 如果你已经进了ETL这个坑,而且预算有限,并且有大量的 ...

最新文章

  1. 【windows】cmd中的help无法使用的解决方法
  2. NCL 小图对其问题
  3. PTA浙大版python程序设计题目集--第3章-5 字符转换 (15 分)
  4. cdt开发java_Eclipse:可以将CDT和Java IDE放在一起
  5. 熟悉linux系统内核,[科普] Linux 的内核与 Linux 系统之间的关系
  6. C++ map的基本和高级操作
  7. Python Qt GUI与数据可视化编程(一)
  8. JAVA JVM优化总结
  9. 如何在 Python 中使用 Plotly 创建太阳系的 3D 模型 (教程含源码)
  10. python django(1170, BLOB/TEXT column 'name' used in key specification without a key length)
  11. 作为大数据技术面试官,我喜欢什么样的应届毕业生?
  12. AD中生成交互式BOM,方便手工焊接及贴片
  13. 安大计算机学院汤进,“CCF合肥庐州论坛——认知计算研讨会”成功举办
  14. 全网详解如何设计数据库的ER图,即实体关系图
  15. Android App Widget中如何调用RemoteView中的函数
  16. 大多数人对职场“为人处世”存在困惑
  17. 网站使用手机相机_手机如何修改证件照片大小和分辨率
  18. 解决远程桌面连接“这可能是由于CreddSSP加密数据库修正”的问题
  19. QT ODBC连接数据库读取中文乱码的一个解决方法
  20. 怎么把aac转mp3格式?这几种转换方式建议学习一下

热门文章

  1. 计算机英语软件系统介绍ppt,ppt软件电脑上显示英文
  2. 浙江环宇集团“营改增”项目启动会成功举办
  3. 京东程序员回应“被猝死”:程序员该如何保护自己的健康?
  4. ubuntu linux编译环境搭建,Ubuntu14.04开发环境搭建
  5. 阿里云PCDN新亮点 自动调用HTTPDNS 解决域名劫持困扰
  6. git head指向老版本_16. branch与HEAD的理解,使用git reset恢复到过去的某个版本
  7. GitHub 的 2021 年度报告,全球程序员好像都在卷呐!
  8. 2台PLC通讯(FX5U和FX5U)
  9. 智付科技集团2018全球合作伙伴大会成功举办 5大战略布局首度公开
  10. 要闻君说:阿里云联合8家芯片模组商推出“全平台通信模组”;北汽与小桔车服联合“京桔”;IBM要帮助印度公司打造5G战略!...