首页 » SEO优化 » PHP对象关系图技巧_GraphQL简明教程

PHP对象关系图技巧_GraphQL简明教程

访客 2024-11-03 0

扫一扫用手机浏览

文章目录 [+]

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

如果希望快速节制区块链运用的开拓,推举汇智网的区块链运用开拓系列教程, 内容涵盖比特币、以太坊、eos、超级账本fabric和tendermint等多种区块链,以及 java、go、nodejs、python、php、c#、dart等多种开拓措辞。

PHP对象关系图技巧_GraphQL简明教程

1、GraphQL的根本架构

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

PHP对象关系图技巧_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 - 汇智网

标签:

相关文章