- PVSM.RU - https://www.pvsm.ru -

GraphQL [1] — это стандарт декларирования структур данных и способов получения данных, который выступает дополнительным слоем между клиентом и сервером. Если вы впервые слышите о GraphQL, то вот пара хороших ресурсов: раз [2] и два [3].
В этой статье я расскажу как вы можете использовать GraphQL в своих проектах на технологиях InterSystems.
На данный момент на платформах компании InterSystems [4] есть несколько способов создания клиент-серверных приложений:
Но чем же так хорош GraphQL? Какие новые возможности он даст по сравнению, например, с REST?
В 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 для работы с данными мы всегда обращаемся к единой точке входа (endpoint) — GQL серверу. Изменяя структуру, поля, параметры запроса мы работаем с разными данными. У того же REST множество endpoint.
Сравним REST c GraphQL на простом примере:

Допустим нужно загрузить контент пользователя, для REST нужно сделать три запроса на сервер:
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 карту придется дополнить новыми endpoint.
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"/>
При том, это единственный endpoint на сервере.
Для того, чтобы начать пользоваться GraphQL необходимо проделать несколько шагов:
Перейдите в браузере по данной ссылке http://localhost:57772/graphiql/index.html [7] (localhost — сервер, 57772 — порт)

Думаю, с областью Запрос и Ответ все понятно, а Схема — это документация, которая генерируется по всем хранимым классам в области.
Схема содержит:
Рассмотрим схему на примере класса Sample_Company:

Так же, GraphiQL поддерживает автодополнение, которое можно вызвать комбинацией клавиш Ctrl + Space:

Запросы могут быть как простыми, так и вложенными, можно запросить несколько наборов данных. Ниже пример запроса данных из двух разных классов Sample_Person и Sample_Company:

На данный момент поддерживается только строгое равенство:

Реализовано 4 функции для пагинации, при необходимости их можно комбинировать:

Чаще всего по условиям бизнес логики приложений для определенного клиента должны быть доступны не все классы области, а те, которым у него есть права, согласно его роли. Исходя из этого возникает необходимость ограничить видимость классов для клиента:
Для изменения способа ограничения видимости необходимо открыть студию, перейти в нужную область и открыть класс GraphQL.Settings. В нем есть параметр SCOPECLASS, его значение по умолчанию установлено GraphQL.Scope.All — это класс, в котором описан интерфейс ограничения видимости классов в области:

Для изменения ограничения видимости классов нужно просто установить одно из значений указанных выше, GraphQL.Scope.Package или GraphQL.Scope.Superclass.
В случае с GraphQL.Scope.Package еще необходимо перейти в этот класс и установить значение параметра Package именем нужного пакета, например, Sample, тогда будут доступны все хранимые классы из этого пакета:

А с GraphQL.Scope.Superclass просто дополнительно наследоваться от этого класса в нужных вам классах:

Запросы:
Запросы:
→ Ссылка [11] на репозиторий проекта
→ Ссылка [12] на демо-сервер
Issues Pull Requests очень приветствуются.
Следите за развитием нашего проекта!
Автор: Gevorg95
Источник [13]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/ensemble/284008
Ссылки в тексте:
[1] GraphQL: http://graphql.org/
[2] раз: https://habr.com/post/335158/
[3] два: https://habr.com/post/326986/
[4] InterSystems: https://www.intersystems.com/
[5] последний релиз: https://github.com/intersystems-ru/GraphQL/releases
[6] собрать : https://github.com/graphql/graphiql
[7] http://localhost:57772/graphiql/index.html: http://localhost:57772/graphiql/index.html
[8] Aliases: https://graphql.github.io/learn/queries/#aliases
[9] Directives: https://graphql.github.io/learn/queries/#directives
[10] Fragments : https://graphql.github.io/learn/queries/#fragments
[11] Ссылка: https://github.com/intersystems-community/GraphQL
[12] Ссылка: http://37.139.6.217:57773/graphiql/index.html
[13] Источник: https://habr.com/post/413717/?utm_campaign=413717
Нажмите здесь для печати.