Перейти к основному содержимому

Показать поле GraphQL с другим именем

· 4 мин. чтения

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 .