用于InterSystems平台的GraphQL


GraphQL是用于声明数据结构和获取数据的方法的标准,它充当客户端和服务器之间的附加层。 如果这是您第一次了解GraphQL,那么这里有一些不错的资源: onetwo


在本文中,我将告诉您如何使用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,您需要向服务器发出三个请求:


  1. 我们通过他的ID加载用户数据
  2. 通过id,我们得到他的帖子
  3. 通过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,您需要执行一些步骤:


  1. 从GitHub下载最新版本并导入所需区域
  2. 转到系统管理门户,然后从InterSystems数据平台(Caché,Ensemble或IRIS)为您的产品创建一个新的Web应用程序:
    • 名称- /
    • 范围- 例如样本
    • 处理程序类-GraphQL.REST.Main
  3. GraphiQL是用于测试GraphQL查询的外壳。 下载最新的汇编GraphiQL版本或自己构建
  4. 创建一个新的Web应用程序:
    • 名称- / graphiql
    • 范围- 例如样本
    • CSP文件的物理路径为C:\ InterSystems \ GraphiQL \

让我们看一下结果


通过以下链接转到浏览器http://本地主机:57772 / graphiql / index.html (本地主机-服务器,57772-端口)


图形语言


我认为,“ 请求响应”区域中的所有内容都是清楚的,而“ 架构”是为该区域中所有存储的类生成的文档。


该电路包含:


  • 班级
  • 属性,参数及其类型
  • 以上所有内容的描述,这些内容是根据评论生成的

考虑使用Sample_Company类作为示例的图



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



咨询处


查询可以是简单查询,也可以是嵌套查询;您可以查询多个数据集。 以下是从两个不同的类Sample_PersonSample_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.PackageGraphQL.Scope.Superclass


对于GraphQL.Scope.Package ,仍然需要转到此类并将Package参数的值设置为所需软件包的名称,例如Sample ,则该软件包中所有已存储的类将可用:



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



目前支持


要求:


  • 基本的
  • 嵌套对象
    • 只有多对一的态度
  • 简单类型表
  • 对象表

正在实施


要求:


  • 嵌套对象
    • 支持所有类型的关系
  • 过滤
    • 不平等支持

在计划中



链接到项目存储库
链接到演示服务器


非常欢迎发布问题请求。
关注我们项目的发展!

Source: https://habr.com/ru/post/zh-CN413717/


All Articles