1. Обзор
GraphQL широко используется в качестве шаблона связи в веб-сервисах. Основная предпосылка GraphQL — быть гибким в использовании клиентскими приложениями.
В этом уроке мы рассмотрим еще один аспект гибкости. Мы также рассмотрим, как поле GraphQL может быть представлено под другим именем.
2. Схема GraphQL
Давайте возьмем пример блога с сообщениями
разных авторов
. Схема GraphQL выглядит примерно так:
type Post {
id: ID!
title: String!
text: String!
category: String
author: Author!
}
type Author {
id: ID!
name: String!
thumbnail: String
posts: [Post]!
}
query {
recentPosts(count: 1,offset: 0){
id
title
text
category
author{
id
name
thumbnail
}
}
}
Здесь мы можем получить последние сообщения. Каждый пост
будет сопровождаться его автором
. Результат запроса следующий:
{
"data": {
"recentPosts": [
{
"id": "Post00",
"title": "Post 0:0",
"text": "Post 0 + by author 0",
"category": null,
"author": {
"id": "Author0",
"name": "Author 0",
"thumbnail": "http://example.com/authors/0"
}
}
]
}
}
3. Предоставление поля GraphQL с другим именем
Клиентское приложение может потребовать использования поля first_author.
Прямо сейчас он использует автора
. Чтобы удовлетворить это требование, у нас есть два решения:
- Измените определение схемы на сервере GraphQL.
- Используйте концепцию псевдонимов в GraphQL
Давайте посмотрим на оба по одному.
3.1. Изменение схемы
Давайте обновим определение схемы поста
:
type Post {
id: ID!
title: String!
text: String!
category: String
first_author: Author!
}
Автор не тривиальное поле .
Это сложно. Нам также придется обновить соответствующий преобразователь, чтобы учесть это изменение.
Метод getAuthor (Post post)
в PostResolver
будет обновлен до getFirst_author (Post post)
.
Вот запрос:
query{
recentPosts(count: 1,offset: 0){
id
title
text
category
first_author{
id
name
thumbnail
}
}
}
Результат вышеуказанного запроса выглядит следующим образом:
{
"data": {
"recentPosts": [
{
"id": "Post00",
"title": "Post 0:0",
"text": "Post 0 + by author 0",
"category": null,
"first_author": {
"id": "Author0",
"name": "Author 0",
"thumbnail": "http://example.com/authors/0"
}
}
]
}
}
Это решение имеет две основные проблемы:
- Он вносит изменения в схему и реализацию на стороне сервера.
- Это заставляет другие клиентские приложения следовать этому обновленному определению схемы.
Эти проблемы противоречат гибкости, которую предлагает GraphQL.
3.2. Псевдонимы GraphQL
Псевдонимы в GraphQL позволяют нам переименовывать результат поля во что угодно без изменения определения схемы. Чтобы ввести псевдоним в запрос, псевдоним и символ двоеточия (:) должны предшествовать полю GraphQL.
Вот демонстрация запроса:
query{
recentPosts(count: 1,offset: 0){
id
title
text
category
first_author:author{
id
name
thumbnail
}
}
}
Результат вышеуказанного запроса выглядит следующим образом:
{
"data": {
"recentPosts": [
{
"id": "Post00",
"title": "Post 0:0",
"text": "Post 0 + by author 0",
"category": null,
"first_author": {
"id": "Author0",
"name": "Author 0",
"thumbnail": "http://example.com/authors/0"
}
}
]
}
}
Заметим, что сам запрос запрашивает первое сообщение. Другое клиентское приложение может запросить first_post
вместо недавних сообщений.
И снова на помощь придут Псевдонимы.
query{
first_post: recentPosts(count: 1,offset: 0){
id
title
text
category
author{
id
name
thumbnail
}
}
}
Результат вышеуказанного запроса выглядит следующим образом:
{
"data": {
"first_post": [
{
"id": "Post00",
"title": "Post 0:0",
"text": "Post 0 + by author 0",
"category": null,
"author": {
"id": "Author0",
"name": "Author 0",
"thumbnail": "http://example.com/authors/0"
}
}
]
}
}
Эти два примера ясно показывают, насколько гибко работать с GraphQL. Каждое клиентское приложение может обновляться в соответствии с требованиями. При этом определение и реализация схемы на стороне сервера остаются прежними.
4. Вывод
В этой статье мы рассмотрели два способа представления поля graphQL с другим именем. Мы представили концепцию псевдонимов с примерами и объяснили, насколько это правильный подход.
Как всегда, пример кода для этой статьи доступен на GitHub .