Что такое самоанализ в GraphQL

GraphQL выделяется своей сильной системой типов. Благодаря системе строгой типизации GraphQL может предоставить систему самоанализа для запроса схемы. Система самоанализа в GraphQL предоставляет клиентам возможность обнаруживать ресурсы, доступные в схеме GraphQL. Система самоанализа — перо в шляпе GraphQL. У него много применений, и мы увидим некоторые из них ниже.

Почему самоанализ полезен?

Предоставляет клиентам полное представление о схеме

С помощью запросов самоанализа клиент может получить полное представление о ресурсах в схеме GraphQL. Это может сэкономить клиенту кучу времени на просмотр документации. Вместо этого они могут проанализировать схему и глубже понять доступные им ресурсы.

Создавайте потрясающие инструменты

Система самоанализа позволяет сообществу создавать потрясающие инструменты для GraphQL. Некоторые из инструментов, которые мы используем сегодня и обязаны своим существованием системе самоанализа, — это GraphiQL, GraphQL Playground и другие. Эти инструменты помогают клиентам изучать схему GraphQL простым и интерактивным способом.

Самостоятельная документация

Эти инструменты GraphQL, такие как GraphQL Playground, используют систему самоанализа для предоставления таких функций, как самостоятельное документирование API, автоматическое завершение и генерация кода.

Запросы самоанализа

Давайте погрузимся в некоторые запросы самоанализа и научимся их писать.

Чтобы продемонстрировать и изучить запросы самоанализа GraphQL, я собираюсь использовать общедоступный API GitHub. Вы можете продолжить, открыв https://developer.github.com/v4/explorer/. Убедитесь, что вы вошли в свою учетную запись GitHub, чтобы выполнять запросы самоанализа.

В проводнике GitHub GraphQL мы можем начать вводить наши запросы с левой стороны и нажать кнопку воспроизведения, чтобы увидеть ответ JSON с правой стороны. Мы также можем просмотреть документацию по API с правой стороны.

Тип схемы запроса

Все поля в системе самоанализа имеют префикс с двумя символами подчеркивания. Давайте запросим поле __schema и узнаем о типах, поддерживаемых в схеме.

query getSchmemaTypes {
  __schema {
    types {
      name
    }
  }
}

Ответ JSON на этот запрос довольно длинный из схемы GitHub, ниже приведен снимок ответа.

{
  "data": {
    "__schema": {
      "types": [
        {
          "name": "AcceptEnterpriseAdministratorInvitationInput"
        },
        {
          "name": "AcceptEnterpriseAdministratorInvitationPayload"
        },
        {
          "name": "AcceptTopicSuggestionInput"
        },
        {
          "name": "AcceptTopicSuggestionPayload"
        }
        ......
       ]
    }
  }
}

Поддерживаемые запросы запросы и мутации

Используя самоанализ, мы также можем получить поддерживаемые запросы и мутации из схемы. Вы также можете использовать поле isDeprecated, чтобы узнать, устарели ли определенные запросы/мутации. Это будет полезной информацией для клиента перед использованием API. В поле __schema запросите queryType и mutationType.

query getSupportedQueries {
  __schema {
    queryType {
      fields{
        name
      }
    }
  }
}

Ответ JSON ниже показывает запросы, поддерживаемые API.

{
  "data": {
    "__schema": {
      "queryType": {
        "fields": [
          {
            "name": "codeOfConduct"
          },
          {
            "name": "codesOfConduct"
          },
          {
            "name": "enterprise"
          },
          {
            "name": "enterpriseAdministratorInvitation"
          },
          {
            "name": "enterpriseAdministratorInvitationByToken"
          },
          {
            "name": "license"
          },
          {
            "name": "licenses"
          },
          {
            "name": "marketplaceCategories"
          },
          {
            "name": "marketplaceCategory"
          },
          {
            "name": "marketplaceListing"
          },
          {
            "name": "marketplaceListings"
          },
          {
            "name": "meta"
          },
          {
            "name": "node"
          },
          {
            "name": "nodes"
          },
          {
            "name": "organization"
          },
          {
            "name": "rateLimit"
          },
          {
            "name": "relay"
          },
          {
            "name": "repository"
          },
          {
            "name": "repositoryOwner"
          },
          .....
      }
    }
  }
}

Типы свойств запроса

Следующий запрос самоанализа, который мы собираемся написать, — это запрос поля __type. При запросе типов нам нужно предоставить имя типа, который мы запрашиваем. Я выбрал один из типов, RepositoryOwner, возвращенный из нашего предыдущего запроса. В приведенном ниже запросе мы ищем описание и название всех полей для типа RepositoryOwner.

query getRepositoryOwnerType {
  __type(name:"RepositoryOwner") {
    description
    fields {
      name
    }
  }
}

Вот ответ JSON. Вы можете увидеть все поля, которые являются частью типа RepositoryOwner.

{
  "data": {
    "__type": {
      "description": "Represents an owner of a Repository.",
      "fields": [
        {
          "name": "avatarUrl"
        },
        {
          "name": "id"
        },
        {
          "name": "login"
        },
        {
          "name": "repositories"
        },
        {
          "name": "repository"
        },
        {
          "name": "resourcePath"
        },
        {
          "name": "url"
        }
      ]
    }
  }
}

Директивы запроса

Из __schema мы также можем запросить директивы, поддерживаемые схемой GraphQL.

query getDirectives {
  __schema {
    directives {
      name
      description
    }
  }
}

Ответ JSON показывает, что схема GitHub поддерживает три директивы: include, skip и deprecated.

{
  "data": {
    "__schema": {
      "directives": [
        {
          "name": "include",
          "description": "Directs the executor to include this field or fragment only when the `if` argument is true."
        },
        {
          "name": "skip",
          "description": "Directs the executor to skip this field or fragment when the `if` argument is true."
        },
        {
          "name": "deprecated",
          "description": "Marks an element of a GraphQL schema as no longer supported."
        }
      ]
    }
  }
}

Вывод

Надеюсь, вам понравилось изучение системы самоанализа GraphQL. Если вы заинтересованы в дальнейшем изучении GraphQL, вы можете ознакомиться с моими курсами по GraphQL на Pluralsight:





Другие ресурсы:

Надеюсь, вам понравилась эта статья. Увидимся снова с новыми статьями. Если вам понравился этот пост, не забудьте поделиться им со своей сетью. Вы можете подписаться на меня в твиттере @AdhithiRavi, чтобы получать больше обновлений или если у вас есть какие-либо вопросы.

Эта история изначально была опубликована на https://programmingwithmosh.com/