
GraphQL是用于声明数据结构和获取数据的方法的标准,它充当客户端和服务器之间的附加层。 如果这是您第一次了解GraphQL,那么这里有一些不错的资源: one和two 。
在本文中,我将告诉您如何使用InterSystems技术在项目中使用GraphQL。
当前,有几种方法可以在InterSystems平台上创建客户端-服务器应用程序:
但是为什么GraphQL这么好? 与REST相比,它将提供哪些新功能?
GraphQL有几种查询类型:
- 查询是对服务器接收数据的请求,就像在REST中一样,建议使用GET请求接收数据。
- 突变 -这种类型负责更改服务器上的数据。 在REST中,用于更改数据POST(PUT,DELETE)请求。
变异 (例如查询)可以返回数据-如果您希望在变异后立即向服务器请求更新的信息,这将非常方便。 - 订阅与将输出数据的查询类型相同。 唯一的区别是, 查询是通过在客户端上呈现页面来触发的,而订阅是通过发突变 来触发的。
GraphQL的主要功能以及值得使用的功能
客户决定他想要接收什么。
GraphQL的主要功能之一是数据的结构和数量由客户端应用程序确定。 客户端使用类似于JSON格式的声明性,类似于图形的结构准确指示要接收的数据。 响应的结构与请求的结构相对应。
这是一个简单的GraphQL查询的样子:
{ Sample_Company { Name } }
以JSON格式回答:
{ "data": { "Sample_Company": [ { "Name": "CompuSoft Associates" }, { "Name": "SynerTel Associates" }, { "Name": "RoboGlomerate Media Inc." }, { "Name": "QuantaTron Partners" } ] } }
单入口
在GraphQL中,要处理数据,我们总是转向一个单一的入口点( 端点 )-GQL服务器。 更改结构,字段,查询参数,我们将处理不同的数据。 相同的REST有许多端点。
通过一个简单的示例将REST与GraphQL进行比较:

假设您要上传用户内容,对于REST,您需要向服务器发出三个请求:
- 我们通过他的ID加载用户数据
- 通过id,我们得到他的帖子
- 通过id我们得到它的订阅者
符合以下要求的REST卡:
<Route Url="/user/:id" Method="GET" Call="GetUserByID"/> <Route Url="/user/:id/posts" Method="GET" Call="GetUserPostsByID"/> <Route Url="/user/:id/follovers" Method="GET" Call="GetUserFolloversByID"/>
要获得新的数据集,必须在REST卡上添加新的端点。
GraphQL在单个查询中处理此任务。 为此,请在请求正文中指定以下内容:
{ operationName: null, // query ( query TestName(...){...} ) query: "query { User(id: "ertg439frjw") { name posts { title } followers(last: 3) { name } } }", variables: null // , query* }
符合此查询的REST卡:
<Route Url="/graphql" Method="POST" Call="GraphQL"/>
而且,这是服务器上的唯一端点。
安装GraphQL和GraphiQL
为了开始使用GraphQL,您需要执行一些步骤:
- 从GitHub下载最新版本并导入所需区域
- 转到系统管理门户,然后从InterSystems数据平台(Caché,Ensemble或IRIS)为您的产品创建一个新的Web应用程序:
- 名称- /
- 范围- 例如样本
- 处理程序类-GraphQL.REST.Main
- GraphiQL是用于测试GraphQL查询的外壳。 下载最新的汇编GraphiQL版本或自己构建
- 创建一个新的Web应用程序:
- 名称- / graphiql
- 范围- 例如样本
- CSP文件的物理路径为C:\ InterSystems \ GraphiQL \
让我们看一下结果
通过以下链接转到浏览器http://本地主机:57772 / graphiql / index.html (本地主机-服务器,57772-端口)

我认为,“ 请求和响应”区域中的所有内容都是清楚的,而“ 架构”是为该区域中所有存储的类生成的文档。
该电路包含:
- 班级
- 属性,参数及其类型
- 以上所有内容的描述,这些内容是根据评论生成的
考虑使用Sample_Company类作为示例的图 :

GraphiQL还支持自动补全,可以通过Ctrl +空格键组合调用:

咨询处
查询可以是简单查询,也可以是嵌套查询;您可以查询多个数据集。 以下是从两个不同的类Sample_Person和Sample_Company查询数据的示例:

筛选
目前,仅支持严格的相等性:

分页
实现了4种分页功能,必要时可以将其组合:
- after:n -ID大于n的所有记录
- 之前:n -ID小于n的所有记录
- 第一:n-前n个条目
- 最后:n-最后n个条目

适用范围
根据针对特定客户的应用程序的业务逻辑,大多数情况下,不是该区域的所有类别都应该可用,而是根据他的角色,他有权使用的类别。 基于此,需要限制类对客户端的可见性:
- 范围内的所有类( GraphQL.Scope.All )
- 从超类( GraphQL.Scope.Superclass )继承的类
- 属于特定包的类( GraphQL.Scope.Package )
要更改可见性受限的方式,您需要打开工作室,转到所需的区域,然后打开GraphQL.Settings类。 它具有SCOPECLASS参数,其默认值设置为GraphQL.Scope.All-这是一个类,用于描述用于限制字段在字段中的可见性的接口:

要更改类的可见性限制,只需设置上面指示的值之一GraphQL.Scope.Package或GraphQL.Scope.Superclass 。
对于GraphQL.Scope.Package ,仍然需要转到此类并将Package参数的值设置为所需软件包的名称,例如Sample ,则该软件包中所有已存储的类将可用:

借助GraphQL.Scope.Superclass,您可以简单地从所需的类中继承该类:

目前支持
要求:
正在实施
要求:
在计划中
→ 链接到项目存储库
→ 链接到演示服务器
非常欢迎发布问题请求。
关注我们项目的发展!