百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

GraphQL简明教程

toyiye 2024-06-24 19:11 10 浏览 0 评论

GraphSQL是为了解决REST API存在的问题而提出的一种新的查询语言。GraphQL将数据对象关系映射到一个图(Graph),并设计了一种查询语言(Query Language)来遍历图中关系 —— 这也是GraphQL名称的来源。本教程将介绍GraphQL规范的基本内容并使用nodejs实现一个简单但完整的GraphQL API服务。

类似于我们熟悉的SQL(Strutural Query Language),GraphSQL也只是规范,你可以使用任何语言来实现GraphQL规范。目前已经有了采用各种主流编程语言的实现,不过在本文中,我们将使用官方提供的JavaScript版本的GraphQL参考实现代码。

如果希望快速掌握区块链应用的开发,推荐汇智网的区块链应用开发系列教程, 内容涵盖比特币、以太坊、eos、超级账本fabric和tendermint等多种区块链,以及 java、go、nodejs、python、php、c#、dart等多种开发语言。

1、GraphQL的基础架构

同样类似于SQL,在GraphQL规范中约定了两个组件:服务器和客户端。

服务器负责处理查询请求,解析查询并使用指定的格式提取数据,然后通常以JSON 格式返回响应。

应用程序可以使用客户端实现与GraphQL的通信,虽然也可以直接向GraphQL服务器 的访问端结点发送一个HTTP POST请求,但是GraphQL客户端提供了更多的功能。

构建一个Graph API会比构建一个REST API的工作量大,但是在速度和可用性方面的提升可以弥补它的复杂性。

2、初识GraphQL

现在我们的小目标是发送一个GraphQL查询请求,然后获取一个响应,以此来初步了解GraphQL。

记住,GraphQL是一种自创一派的查询语言,它不难学,而且大多数情况下查询的写法很合直觉,容易理解。

现在先让我们假设有一个航班和乘客信息数据库。

在GraphQL中,我们可能这样来查询一个航班:

{

flight(id: "1234") {

origin

destination

}

}

这个GraphQL查询语句的意思是:查询航班(flight)1234的出发地(origin)和目的地(destination)。

上述查询的响应如下:

{

"data": {

"flight": {

"origin": "DFW",

"destination": "MKE"

}

}

}

你看,虽然航班信息可能包含很多字段,但是由于我们在查询语句中指定了要返回的字段,所以服务器精准的只返回这一部分数据,不多也不少。

这有点像你在SQL查询时指定返回字段的感觉,不过GraphQL比这个还要强。假设接下来要查询航班1234的出发地、目的地以及所有乘客的姓名,可以这样写查询语句:

{

flight(id: "1234") {

origin

destination

passengers {

name

}

}

}

在这个查询中,GraphQL就需要考虑航班数据、乘客数据以及这两者的关系了。

响应结果如下:

{

"data": {

"flight": {

"origin": "DFW",

"destination": "MKE",

"passengers": [

{

"name": "Luke Skywalker"

},

{

"name": "Han Solo"

},

{

"name": "R2-D2"

}

]

}

}

}

COOOOOOOOOOOOOOOOOOOOOOOL!我们只进行了一次API调用就同时获取了航班的起止地点以及全部乘客的名字!

由于GraphQL将数据关系视为图,因此我们可以从任意方向进行遍历,例如查询乘客Luke Skywalker的护照号以及所乘航班的编号、日期、出发地和目的地:

{

person(name: "Luke Skywalker") {

passport_number

flights {

id

date

origin

destination

}

}

这个查询的返回结果看起来是这样:

{

"data": {

"person": {

"passport_number": 78120935,

"flights": [

{

"id": "1234",

"date": "2019-05-24",

"origin": "DFW",

"destination": "MKE"

},

{

"id": "2621",

"date": "2019-07-05",

"origin": "MKE",

"destination": "DFW"

}

]

}

}

}

3、实现GraphQL API

前面我们了解了GraphQL的查询与响应交互。现在我们了解如何实现GraphQL Server。下面列出了接下来要做的工作:

选择一个实现GraphQL Server的开发框架,我们选择Express

定义数据架构,以免GraphQL知道如何路由收到的查询请求

创建用于处理请求并返回响应结果的解析函数

构建访问端结点

编写客户端查询进行测试

然后,你就可以在客户端应用中使用GraphQL的强大查询能力了,不过在本教程中我们不会涉及如何在你的应用中嵌入GraphQL查询能力。另外,在现实应用中,绝大多数GraphQL的应用都会涉及到数据库,不过在这个教程中我们也不会涉及数据库的操作。

3.1 实现GraphQL服务器

首先,确保你已经安装了nodejs和npm。

接下来让我们创建一个Express服务器。先初始化:

$ npm initThis utility will walk you through creating a package.json file.

It only covers the most common items, and tries to guess sensible defaults.See `npm help json` for definitive documentation on these fields

and exactly what they do.Use `npm install <pkg>` afterwards to install a package and

save it as a dependency in the package.json file.Press ^C at any time to quit.

package name: (graphql-medium)

version: (1.0.0)

description:

entry point: (index.js)

test command:

git repository:

keywords:

author:

license: (ISC)

About to write to /home/bennett/Repos/graphql-medium/package.json:{

"name": "graphql-medium",

"version": "1.0.0",

"description": "",

"main": "index.js",

"scripts": {

"test": "echo \"Error: no test specified\" && exit 1"

},

"author": "",

"license": "ISC"

}Is this OK? (yes)

你可以一路回车下来,以后还有机会修改生成的package.json。

接下来,让我们安装Express、GraphQL和Express-GraphQL库:

$ npm install express express-graphql graphqlnpm notice created a lockfile as package-lock.json. You should commit this file.

npm WARN graphql-medium@1.0.0 No description

npm WARN graphql-medium@1.0.0 No repository field.+ express-graphql@0.8.0

+ graphql@14.3.1

+ express@4.17.0

added 53 packages from 38 contributors and audited 151 packages in 6.169s

found 0 vulnerabilities

现在,创建文件index.js,实现一个基本的Express Server:

// index.js

const express = require('express');

const app = express();

app.get('/', function(req, res) {

res.send('Express is working!')

});

app.listen(4000, function() {

console.log('Listening on port 4000')

});

试着运行命令node index.js,你应当会看到如下提示信息:

Listening on port 4000

使用浏览器访问http://localhost:4000/,就可以看到如下内容:

Express is working!”

3.2 定义数据架构

首先,我们引入必要的模块:

const graphqlHTTP = require('express-graphql');

const { buildSchema } = require('graphql');

接下来让我们先定义一个hello world数据架构来让代码跑起来。

let schema = buildSchema(`

type Query {

hello: String

}

`);

这个简单的数据架构的作用,就是告诉GraphQL当有查询hello时,我们要返回一个字符串。

3.3 解析查询语句

当有人提交对hello的查询时,我们将要返回一个字符串,这是我们在上面的数据架构中定义的。

现在我们需要告诉GraphQL应当返回哪个字符串 —— 这就是解析器的作用 ——找出要返回的数据。

在这个示例中,解析器非常简单,我们直接返回一个字符串常量:

return 'Hello world!';

1

但是我们需要把上述语言封装到一个函数中,任何时候有人查询hello,只需要调用这个函数就可以了:

function() {

return 'Hello world!';

}

目前而言,hello是我们实现的唯一的查询类型。在将来我们也可以包含其他的访问端结点。现在先将hello和我们的解析器函数关联起来:

let root = {

hello: function() {

return 'Hello world!';

},

}

3.4 设置访问端结点

你可能会注意到,我们在前面导入了graphqlHTTP,但并没有使用它。现在是时候了,我们将创建一个新的路由来提供GraphQL API服务:

app.use('/graphql', graphqlHTTP({

schema: schema,

rootValue: root,

graphiql: true,

}));

schema和root都指向我们前面定义的变量。graphiql是一个有用的可视化工具,它与GraphSQL一起安装,

我们接下来将用它进行GraphQL API的测试。

3.5 查询测试

现在可以启动GraphQL服务器,进行测试了!

启动应用:node index.js

用浏览器访问http://localhost:4000/graphql

应该看到graphiql的界面:

现在就可以用这个界面来测试我们的GraphQL API了!

{

hello

}

点击提交按钮,将会看到:

{

"data": {

"hello": "Hello world!"

}

}

IT’S WORKING!!!

原文链接:从SQL到GraphQL - 汇智网

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码