HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-21
1 <p><a>#статьи</a></p>
1 <p><a>#статьи</a></p>
2 <ul><li>19 ноя 2024</li>
2 <ul><li>19 ноя 2024</li>
3 <li>0</li>
3 <li>0</li>
4 </ul><p>Программист в кафе: "Вы приготовите стейк по моему алгоритму?" Официант: "У нас только готовые блюда" Программист: "Эх, REST-кухня..."</p>
4 </ul><p>Программист в кафе: "Вы приготовите стейк по моему алгоритму?" Официант: "У нас только готовые блюда" Программист: "Эх, REST-кухня..."</p>
5 <p>Иллюстрация: Оля Ежак для Skillbox Media</p>
5 <p>Иллюстрация: Оля Ежак для Skillbox Media</p>
6 <p>Пишет о сетях, инструментах для разработчиков и языках программирования. Любит готовить, играть в инди‑игры и программировать на Python.</p>
6 <p>Пишет о сетях, инструментах для разработчиков и языках программирования. Любит готовить, играть в инди‑игры и программировать на Python.</p>
7 <p>Представьте два ресторана. В первом - фиксированное меню с готовыми комбинациями блюд. Если хотите пиццу, то получите её вместе с салатом и кофе, даже если они вам не нужны. Во втором ресторане шеф-повар готовит блюда индивидуально для каждого гостя, и вы можете выбрать ингредиенты на свой вкус. Вам подадут именно то, что вы заказали.</p>
7 <p>Представьте два ресторана. В первом - фиксированное меню с готовыми комбинациями блюд. Если хотите пиццу, то получите её вместе с салатом и кофе, даже если они вам не нужны. Во втором ресторане шеф-повар готовит блюда индивидуально для каждого гостя, и вы можете выбрать ингредиенты на свой вкус. Вам подадут именно то, что вы заказали.</p>
8 <p>В веб-разработке первый ресторан похож на REST API, а второй - на GraphQL. REST API предоставляет разработчикам фиксированные наборы данных, тогда как GraphQL позволяет запрашивать им только то, что действительно необходимо.</p>
8 <p>В веб-разработке первый ресторан похож на REST API, а второй - на GraphQL. REST API предоставляет разработчикам фиксированные наборы данных, тогда как GraphQL позволяет запрашивать им только то, что действительно необходимо.</p>
9 <p>В этой статье мы подробно разберём GraphQL: изучим его концепцию, предназначение, ключевые преимущества и принцип работы.</p>
9 <p>В этой статье мы подробно разберём GraphQL: изучим его концепцию, предназначение, ключевые преимущества и принцип работы.</p>
10 <p><strong>Содержание</strong></p>
10 <p><strong>Содержание</strong></p>
11 <ul><li><a>Что такое GraphQL</a></li>
11 <ul><li><a>Что такое GraphQL</a></li>
12 <li><a>Для чего нужен GraphQL</a></li>
12 <li><a>Для чего нужен GraphQL</a></li>
13 <li><a>Какие преимущества у GraphQL</a></li>
13 <li><a>Какие преимущества у GraphQL</a></li>
14 <li><a>Как работает GraphQL</a></li>
14 <li><a>Как работает GraphQL</a></li>
15 </ul><ul><li><a>Поля (fields)</a></li>
15 </ul><ul><li><a>Поля (fields)</a></li>
16 <li><a>Аргументы (arguments)</a></li>
16 <li><a>Аргументы (arguments)</a></li>
17 <li><a>Переменные (variables)</a></li>
17 <li><a>Переменные (variables)</a></li>
18 <li><a>Фрагменты (fragments)</a></li>
18 <li><a>Фрагменты (fragments)</a></li>
19 <li><a>Псевдонимы (aliases)</a></li>
19 <li><a>Псевдонимы (aliases)</a></li>
20 <li><a>Директивы (directives)</a></li>
20 <li><a>Директивы (directives)</a></li>
21 </ul><p>Далее мы простым языком расскажем о GraphQL и его возможностях. Однако этот материал может оказаться сложным для новичков. Поэтому, перед тем как продолжить чтение, рекомендуем ознакомиться со следующими статьями:</p>
21 </ul><p>Далее мы простым языком расскажем о GraphQL и его возможностях. Однако этот материал может оказаться сложным для новичков. Поэтому, перед тем как продолжить чтение, рекомендуем ознакомиться со следующими статьями:</p>
22 <p>GraphQL - это специализированный язык запросов для работы с данными, разработанный компанией "Фейсбук"* в 2012 году. Он решил проблему производительности мобильных приложений, которые часто получали от сервера избыточные или неполные данные. В 2015 году<a>технология стала общедоступной</a>, а позже<a>перешла</a>под управление Linux Foundation.</p>
22 <p>GraphQL - это специализированный язык запросов для работы с данными, разработанный компанией "Фейсбук"* в 2012 году. Он решил проблему производительности мобильных приложений, которые часто получали от сервера избыточные или неполные данные. В 2015 году<a>технология стала общедоступной</a>, а позже<a>перешла</a>под управление Linux Foundation.</p>
23 <p>До GraphQL разработчики в основном использовали REST API для взаимодействия с сервером. В REST-архитектуре у каждого ресурса есть уникальный URL-адрес, а клиенты общаются с сервером через HTTP-методы: GET, POST, PUT, DELETE и другие.</p>
23 <p>До GraphQL разработчики в основном использовали REST API для взаимодействия с сервером. В REST-архитектуре у каждого ресурса есть уникальный URL-адрес, а клиенты общаются с сервером через HTTP-методы: GET, POST, PUT, DELETE и другие.</p>
24 <p>Допустим, мы хотим получить информацию о постах и подписчиках пользователя. С REST API нам придётся отправить несколько запросов, что приведёт к получению избыточных данных и увеличению нагрузки на сеть.</p>
24 <p>Допустим, мы хотим получить информацию о постах и подписчиках пользователя. С REST API нам придётся отправить несколько запросов, что приведёт к получению избыточных данных и увеличению нагрузки на сеть.</p>
25 <p>Пример запроса:</p>
25 <p>Пример запроса:</p>
26 GET /api/users/123 GET /api/users/123/posts GET /api/users/123/followers<p>Ниже пример ответа с данными, которые мы не запрашивали. Сервер прислал дату рождения, адрес пользователя и полное содержание постов:</p>
26 GET /api/users/123 GET /api/users/123/posts GET /api/users/123/followers<p>Ниже пример ответа с данными, которые мы не запрашивали. Сервер прислал дату рождения, адрес пользователя и полное содержание постов:</p>
27 // GET /api/users/123 { "id": "123", "name": "Иван Петров", "email": "ivan@example.com", "birthDate": "1990-01-01", // ? Избыточные данные "address": "ул. Пушкина, д. 10, г. Москва, Россия" // ? Избыточные данные } // GET /api/users/123/posts [ { "id": "1", "title": "Мой первый пост", "content": "Здесь содержание первого поста..." }, // ? Избыточные данные (content) { "id": "2", "title": "Второй пост", "content": "А это содержание второго поста..." } // ? Избыточные данные (content) ] // GET /api/users/123/followers [ { "id": "456", "name": "Мария Сидорова" }, { "id": "789", "name": "Алексей Иванов" } ]<p>А вот запрос, составленный с помощью GraphQL:</p>
27 // GET /api/users/123 { "id": "123", "name": "Иван Петров", "email": "ivan@example.com", "birthDate": "1990-01-01", // ? Избыточные данные "address": "ул. Пушкина, д. 10, г. Москва, Россия" // ? Избыточные данные } // GET /api/users/123/posts [ { "id": "1", "title": "Мой первый пост", "content": "Здесь содержание первого поста..." }, // ? Избыточные данные (content) { "id": "2", "title": "Второй пост", "content": "А это содержание второго поста..." } // ? Избыточные данные (content) ] // GET /api/users/123/followers [ { "id": "456", "name": "Мария Сидорова" }, { "id": "789", "name": "Алексей Иванов" } ]<p>А вот запрос, составленный с помощью GraphQL:</p>
28 query { user(id: "123") { name email posts { title } followers { name } } }<p>Ответ от сервера:</p>
28 query { user(id: "123") { name email posts { title } followers { name } } }<p>Ответ от сервера:</p>
29 { "data": { "user": { "name": "Иван Петров", "email": "ivan@example.com", "posts": [ { "title": "Мой первый пост" }, { "title": "Второй пост" } ], "followers": [ { "name": "Мария Сидорова" }, { "name": "Алексей Иванов" } ] } } }<p>GraphQL повысил производительность приложений многих компаний. К примеру, GitHub<a>сократил</a>количество запросов к API на 80% для некоторых страниц, а Netflix<a>уменьшил</a>объём передаваемых данных на 30-40%.</p>
29 { "data": { "user": { "name": "Иван Петров", "email": "ivan@example.com", "posts": [ { "title": "Мой первый пост" }, { "title": "Второй пост" } ], "followers": [ { "name": "Мария Сидорова" }, { "name": "Алексей Иванов" } ] } } }<p>GraphQL повысил производительность приложений многих компаний. К примеру, GitHub<a>сократил</a>количество запросов к API на 80% для некоторых страниц, а Netflix<a>уменьшил</a>объём передаваемых данных на 30-40%.</p>
30 <p>Помимо оптимизации запросов, GraphQL решает и другие важные задачи:</p>
30 <p>Помимо оптимизации запросов, GraphQL решает и другие важные задачи:</p>
31 <ul><li>Упрощает интеграцию различных систем и микросервисов, создавая единый API для доступа к разным источникам данных. Например, можно объединить данные из системы управления товарами, платёжной платформы и службы доставки.</li>
31 <ul><li>Упрощает интеграцию различных систем и микросервисов, создавая единый API для доступа к разным источникам данных. Например, можно объединить данные из системы управления товарами, платёжной платформы и службы доставки.</li>
32 <li>Ускоряет процесс разработки, позволяя адаптировать запросы под клиента без изменения серверной части. Например, мобильное приложение может запрашивать базовую информацию о пользователе, а веб-версия - расширенные данные. Это позволяет использовать один API для разных клиентов без изменений на сервере.</li>
32 <li>Ускоряет процесс разработки, позволяя адаптировать запросы под клиента без изменения серверной части. Например, мобильное приложение может запрашивать базовую информацию о пользователе, а веб-версия - расширенные данные. Это позволяет использовать один API для разных клиентов без изменений на сервере.</li>
33 <li>Упрощает работу с API. GraphQL использует единую точку доступа для всех запросов, что позволяет мгновенно интегрировать новую информацию в систему. Например, если к товарам в интернет-магазине добавить новую характеристику, то она сразу станет доступной для всех клиентских приложений - для этого не придётся обновлять API или создавать новые точки доступа.</li>
33 <li>Упрощает работу с API. GraphQL использует единую точку доступа для всех запросов, что позволяет мгновенно интегрировать новую информацию в систему. Например, если к товарам в интернет-магазине добавить новую характеристику, то она сразу станет доступной для всех клиентских приложений - для этого не придётся обновлять API или создавать новые точки доступа.</li>
34 <li>Обеспечивает простое обновление API. Разработчики могут добавлять новые поля в схему GraphQL, не нарушая работу существующих клиентов. Это позволяет постепенно расширять функциональность API без создания новых версий или нарушения обратной совместимости. Например, если добавить поле "рейтинг" для товара, существующие приложения продолжат работать без изменений, а новые смогут использовать эту дополнительную информацию.</li>
34 <li>Обеспечивает простое обновление API. Разработчики могут добавлять новые поля в схему GraphQL, не нарушая работу существующих клиентов. Это позволяет постепенно расширять функциональность API без создания новых версий или нарушения обратной совместимости. Например, если добавить поле "рейтинг" для товара, существующие приложения продолжат работать без изменений, а новые смогут использовать эту дополнительную информацию.</li>
35 </ul><p>GraphQL и REST - это не единственные технологии для работы с API и обмена данными. Вот ещё несколько популярных решений:</p>
35 </ul><p>GraphQL и REST - это не единственные технологии для работы с API и обмена данными. Вот ещё несколько популярных решений:</p>
36 <ul><li><a>gRPC (gRPC remote procedure call)</a> - это фреймворк, который применяется в микросервисной архитектуре и высоконагруженных системах, требующих максимальной производительности. Например, при потоковой передаче видео или обработке транзакций.</li>
36 <ul><li><a>gRPC (gRPC remote procedure call)</a> - это фреймворк, который применяется в микросервисной архитектуре и высоконагруженных системах, требующих максимальной производительности. Например, при потоковой передаче видео или обработке транзакций.</li>
37 <li><a>OData (open data protocol)</a> - это протокол для стандартизации API в корпоративной среде, позволяющий фильтровать и сортировать данные через URL-параметры. С ним удобно создавать динамические отчёты для анализа продаж, инвентаризации и так далее.</li>
37 <li><a>OData (open data protocol)</a> - это протокол для стандартизации API в корпоративной среде, позволяющий фильтровать и сортировать данные через URL-параметры. С ним удобно создавать динамические отчёты для анализа продаж, инвентаризации и так далее.</li>
38 <li><a>SOAP (simple object access protocol)</a> - это протокол для обмена данными между корпоративными сетями, базами данных и прочими системами. SOAP часто используется в банковской сфере. Например, для отправки запроса на проверку баланса счёта клиента или проведения денежного перевода.</li>
38 <li><a>SOAP (simple object access protocol)</a> - это протокол для обмена данными между корпоративными сетями, базами данных и прочими системами. SOAP часто используется в банковской сфере. Например, для отправки запроса на проверку баланса счёта клиента или проведения денежного перевода.</li>
39 <li><a>Falcor</a> - это библиотека для оптимизации передачи данных между клиентом и сервером, разработанная Netflix. Она повышает производительность веб-приложений с большими объёмами данных. Например, при просмотре каталога фильмов Falcor загружает только те данные, которые видны на экране. При дальнейшей прокрутке страницы подгружаются новые постеры и описания, а неактуальная информация очищается из памяти.</li>
39 <li><a>Falcor</a> - это библиотека для оптимизации передачи данных между клиентом и сервером, разработанная Netflix. Она повышает производительность веб-приложений с большими объёмами данных. Например, при просмотре каталога фильмов Falcor загружает только те данные, которые видны на экране. При дальнейшей прокрутке страницы подгружаются новые постеры и описания, а неактуальная информация очищается из памяти.</li>
40 </ul><p>Каждая из перечисленных технологий обладает своими особенностями, но есть характеристики, благодаря которым разработчики часто отдают предпочтение именно GraphQL:</p>
40 </ul><p>Каждая из перечисленных технологий обладает своими особенностями, но есть характеристики, благодаря которым разработчики часто отдают предпочтение именно GraphQL:</p>
41 <ul><li><strong>Гибкость запросов.</strong>В отличие от REST и SOAP, GraphQL позволяет клиентам запрашивать только необходимые данные, что уменьшает объём передаваемой информации и количество запросов. Например, с помощью GraphQL можно одним запросом получить профиль пользователя, его посты и список друзей. В случае с REST для этого пришлось бы выполнить несколько отдельных запросов. Пример подобных запросов мы рассмотрели в начале статьи.</li>
41 <ul><li><strong>Гибкость запросов.</strong>В отличие от REST и SOAP, GraphQL позволяет клиентам запрашивать только необходимые данные, что уменьшает объём передаваемой информации и количество запросов. Например, с помощью GraphQL можно одним запросом получить профиль пользователя, его посты и список друзей. В случае с REST для этого пришлось бы выполнить несколько отдельных запросов. Пример подобных запросов мы рассмотрели в начале статьи.</li>
42 <li><strong>Типизация данных.</strong>В отличие от REST, GraphQL обладает встроенной строгой системой типов, что упрощает валидацию данных и снижает вероятность ошибок при разработке. Например, если в схеме GraphQL поле age определено как целое число, сервер автоматически отклонит запрос с некорректным значением - строкой тридцать вместо числа 30.</li>
42 <li><strong>Типизация данных.</strong>В отличие от REST, GraphQL обладает встроенной строгой системой типов, что упрощает валидацию данных и снижает вероятность ошибок при разработке. Например, если в схеме GraphQL поле age определено как целое число, сервер автоматически отклонит запрос с некорректным значением - строкой тридцать вместо числа 30.</li>
43 <li><strong>Версионирование API.</strong>В отличие от REST и SOAP, GraphQL позволяет добавлять новые поля и типы без нарушения работы существующих запросов. Например, вы можете добавить поле phoneNumber к типу User в схеме GraphQL. После изменения существующие клиенты продолжат работать как прежде, а новые смогут использовать добавленное поле без создания новой версии API.</li>
43 <li><strong>Версионирование API.</strong>В отличие от REST и SOAP, GraphQL позволяет добавлять новые поля и типы без нарушения работы существующих запросов. Например, вы можете добавить поле phoneNumber к типу User в схеме GraphQL. После изменения существующие клиенты продолжат работать как прежде, а новые смогут использовать добавленное поле без создания новой версии API.</li>
44 <li><strong>Производительность в сложных сценариях.</strong>По сравнению с gRPC, GraphQL эффективнее обрабатывает комплексные запросы, когда необходимо получить связанную информацию из разных источников. Например, в e-commerce-приложении GraphQL может одним запросом извлечь детали товара, информацию о его наличии, отзывы и скидки. При использовании gRPC для получения той же информации потребовалось бы несколько вызовов.</li>
44 <li><strong>Производительность в сложных сценариях.</strong>По сравнению с gRPC, GraphQL эффективнее обрабатывает комплексные запросы, когда необходимо получить связанную информацию из разных источников. Например, в e-commerce-приложении GraphQL может одним запросом извлечь детали товара, информацию о его наличии, отзывы и скидки. При использовании gRPC для получения той же информации потребовалось бы несколько вызовов.</li>
45 </ul><p>Как и любая технология, GraphQL имеет свои недостатки, и один из ключевых - сложность кэширования. В REST кэширование настраивается с помощью стандартных HTTP-заголовков, а GraphQL не поддерживает эту функцию напрямую. Для решения этой проблемы необходимо использовать дополнительные библиотеки или разрабатывать собственную логику кэширования. Из-за этого GraphQL часто комбинируют с другими технологиями. Например, если у вас уже есть REST API, можно постепенно внедрять GraphQL, сохраняя преимущества обоих подходов.</p>
45 </ul><p>Как и любая технология, GraphQL имеет свои недостатки, и один из ключевых - сложность кэширования. В REST кэширование настраивается с помощью стандартных HTTP-заголовков, а GraphQL не поддерживает эту функцию напрямую. Для решения этой проблемы необходимо использовать дополнительные библиотеки или разрабатывать собственную логику кэширования. Из-за этого GraphQL часто комбинируют с другими технологиями. Например, если у вас уже есть REST API, можно постепенно внедрять GraphQL, сохраняя преимущества обоих подходов.</p>
46 <p>GraphQL функционирует по принципу "запрос - ответ" между клиентом и сервером:</p>
46 <p>GraphQL функционирует по принципу "запрос - ответ" между клиентом и сервером:</p>
47 <ul><li>На сервере создаётся схема, описывающая все доступные типы данных, поля и операции, которые можно выполнить через API.</li>
47 <ul><li>На сервере создаётся схема, описывающая все доступные типы данных, поля и операции, которые можно выполнить через API.</li>
48 <li>Клиент формирует запрос, точно указывая необходимые данные.</li>
48 <li>Клиент формирует запрос, точно указывая необходимые данные.</li>
49 <li>Клиент отправляет запрос на сервер через<a>HTTP-метод POST</a>.</li>
49 <li>Клиент отправляет запрос на сервер через<a>HTTP-метод POST</a>.</li>
50 <li>Сервер анализирует запрос, проверяет его соответствие схеме и выполняет нужные операции для получения данных.</li>
50 <li>Сервер анализирует запрос, проверяет его соответствие схеме и выполняет нужные операции для получения данных.</li>
51 <li>Сервер отправляет клиенту ответ, содержащий только запрашиваемую информацию.</li>
51 <li>Сервер отправляет клиенту ответ, содержащий только запрашиваемую информацию.</li>
52 <li>Клиент получает данные и использует их для обновления интерфейса или других операций.</li>
52 <li>Клиент получает данные и использует их для обновления интерфейса или других операций.</li>
53 </ul><p>Для построения запросов GraphQL используются шесть основных компонентов: поля (fields), аргументы (arguments), фрагменты (fragments), псевдонимы (aliases), переменные (variables) и директивы (directives). Рассмотрим их подробнее.</p>
53 </ul><p>Для построения запросов GraphQL используются шесть основных компонентов: поля (fields), аргументы (arguments), фрагменты (fragments), псевдонимы (aliases), переменные (variables) и директивы (directives). Рассмотрим их подробнее.</p>
54 <p>Поля в GraphQL - это запрашиваемые данные. Они определяют, какую именно информацию клиент хочет получить от сервера.</p>
54 <p>Поля в GraphQL - это запрашиваемые данные. Они определяют, какую именно информацию клиент хочет получить от сервера.</p>
55 <p>Порядок заполнения полей в GraphQL-запросе:</p>
55 <p>Порядок заполнения полей в GraphQL-запросе:</p>
56 <ul><li>Укажите нужные поля внутри фигурных скобок после имени запроса.</li>
56 <ul><li>Укажите нужные поля внутри фигурных скобок после имени запроса.</li>
57 <li>Вложенные поля заключайте в фигурные скобки.</li>
57 <li>Вложенные поля заключайте в фигурные скобки.</li>
58 <li>Разделяйте поля переносом строки или пробелом.</li>
58 <li>Разделяйте поля переносом строки или пробелом.</li>
59 <li>Не ставьте запятые между полями.</li>
59 <li>Не ставьте запятые между полями.</li>
60 </ul><p>Пример:</p>
60 </ul><p>Пример:</p>
61 { user { name email posts { title content } } }<p>Запросим у сервера имя и email пользователя:</p>
61 { user { name email posts { title content } } }<p>Запросим у сервера имя и email пользователя:</p>
62 { user { name email } }<p>Ответ сервера:</p>
62 { user { name email } }<p>Ответ сервера:</p>
63 { "data": { "user": { "name": "Иван Петров", "email": "ivanpetrov@example.com" } } }<p>Аргументы помогают уточнить запрос и получить конкретные данные. С их помощью вы можете фильтровать, сортировать или ограничивать результаты запроса.</p>
63 { "data": { "user": { "name": "Иван Петров", "email": "ivanpetrov@example.com" } } }<p>Аргументы помогают уточнить запрос и получить конкретные данные. С их помощью вы можете фильтровать, сортировать или ограничивать результаты запроса.</p>
64 <p>Порядок добавления аргумента в GraphQL-запрос:</p>
64 <p>Порядок добавления аргумента в GraphQL-запрос:</p>
65 <ul><li>Укажите аргумент в круглых скобках после имени поля.</li>
65 <ul><li>Укажите аргумент в круглых скобках после имени поля.</li>
66 <li>Используйте формат имя: значение для передачи аргумента.</li>
66 <li>Используйте формат имя: значение для передачи аргумента.</li>
67 <li>Разделяйте несколько аргументов запятыми.</li>
67 <li>Разделяйте несколько аргументов запятыми.</li>
68 <li>Заключайте значения строк в кавычки, а числа указывайте без кавычек.</li>
68 <li>Заключайте значения строк в кавычки, а числа указывайте без кавычек.</li>
69 </ul><p>Пример запроса с несколькими аргументами:</p>
69 </ul><p>Пример запроса с несколькими аргументами:</p>
70 { users(first: 5, status: "active") { name email } } # Ограничиваем результат пятью активными пользователями.<p>Ответ сервера:</p>
70 { users(first: 5, status: "active") { name email } } # Ограничиваем результат пятью активными пользователями.<p>Ответ сервера:</p>
71 { "data": { "users": [ { "name": "Иван Петров", "email": "ivanpetrov@example.com" }, { "name": "Мария Сидорова", "email": "mariasidorova@example.com" }, { "name": "Алексей Иванов", "email": "alexeyivanov@example.com" }, { "name": "Елена Смирнова", "email": "elenasmirnova@example.com" }, { "name": "Павел Козлов", "email": "pavelkozlov@example.com" } ] } }<p>Переменные в GraphQL повышают гибкость запросов - они позволяют использовать динамические параметры вместо фиксированных значений. Это удобно, когда нужно выполнить один запрос с разными значениями.</p>
71 { "data": { "users": [ { "name": "Иван Петров", "email": "ivanpetrov@example.com" }, { "name": "Мария Сидорова", "email": "mariasidorova@example.com" }, { "name": "Алексей Иванов", "email": "alexeyivanov@example.com" }, { "name": "Елена Смирнова", "email": "elenasmirnova@example.com" }, { "name": "Павел Козлов", "email": "pavelkozlov@example.com" } ] } }<p>Переменные в GraphQL повышают гибкость запросов - они позволяют использовать динамические параметры вместо фиксированных значений. Это удобно, когда нужно выполнить один запрос с разными значениями.</p>
72 <p>Порядок использования переменной:</p>
72 <p>Порядок использования переменной:</p>
73 <ul><li>Объявите её в начале запроса, используя знак $ перед именем переменной.</li>
73 <ul><li>Объявите её в начале запроса, используя знак $ перед именем переменной.</li>
74 <li>Укажите тип переменной после двоеточия. Например: String, Int, Boolean.</li>
74 <li>Укажите тип переменной после двоеточия. Например: String, Int, Boolean.</li>
75 <li>Добавьте восклицательный знак ! после типа, если переменная обязательна.</li>
75 <li>Добавьте восклицательный знак ! после типа, если переменная обязательна.</li>
76 <li>В самом запросе используйте переменную, указывая её имя со знаком $.</li>
76 <li>В самом запросе используйте переменную, указывая её имя со знаком $.</li>
77 </ul><p>Для примера объявим переменную типа<em>ID</em>, обязательную для выполнения запроса:</p>
77 </ul><p>Для примера объявим переменную типа<em>ID</em>, обязательную для выполнения запроса:</p>
78 query getUser($id: ID!) { user(id: $id) { name email } }<p>После объявления переменной мы должны отправить запрос на сервер, передав значение переменной $id в отдельном объекте JSON:</p>
78 query getUser($id: ID!) { user(id: $id) { name email } }<p>После объявления переменной мы должны отправить запрос на сервер, передав значение переменной $id в отдельном объекте JSON:</p>
79 { "id": "123" } # "123" - это предполагаемый ID пользователя, информацию о котором мы хотим получить.<p>Ответ сервера:</p>
79 { "id": "123" } # "123" - это предполагаемый ID пользователя, информацию о котором мы хотим получить.<p>Ответ сервера:</p>
80 { "data": { "user": { "name": "Иван Петров", "email": "ivanpetrov@example.com" } } }<p>Фрагменты оптимизируют код, группируя часто используемые поля в единый блок. Это упрощает структуру запросов и облегчает их поддержку.</p>
80 { "data": { "user": { "name": "Иван Петров", "email": "ivanpetrov@example.com" } } }<p>Фрагменты оптимизируют код, группируя часто используемые поля в единый блок. Это упрощает структуру запросов и облегчает их поддержку.</p>
81 <p>Порядок создания фрагмента:</p>
81 <p>Порядок создания фрагмента:</p>
82 <ul><li>Используйте ключевое слово fragment, за которым должно последовать имя фрагмента.</li>
82 <ul><li>Используйте ключевое слово fragment, за которым должно последовать имя фрагмента.</li>
83 <li>Укажите тип, на котором определён фрагмент. Для этого используйте ключевое слово on.</li>
83 <li>Укажите тип, на котором определён фрагмент. Для этого используйте ключевое слово on.</li>
84 <li>В фигурных скобках перечислите поля, которые должны быть включены во фрагмент.</li>
84 <li>В фигурных скобках перечислите поля, которые должны быть включены во фрагмент.</li>
85 </ul><p>Пример создания фрагмента:</p>
85 </ul><p>Пример создания фрагмента:</p>
86 fragment UserBasicInfo on User { id name email }<p>Чтобы использовать фрагмент в запросе, добавьте три точки … перед его именем:</p>
86 fragment UserBasicInfo on User { id name email }<p>Чтобы использовать фрагмент в запросе, добавьте три точки … перед его именем:</p>
87 query { user(id: "123") { ...UserBasicInfo age } } # Используем поля из фрагмента UserBasicInfo и поле age.<p>Ответ от сервера:</p>
87 query { user(id: "123") { ...UserBasicInfo age } } # Используем поля из фрагмента UserBasicInfo и поле age.<p>Ответ от сервера:</p>
88 { "data": { "user": { "id": "123", "name": "Иван Петров", "email": "ivanpetrov@example.com", "age": 30 } } } # Мы получили поля id, name и email из фрагмента UserBasicInfo, а также дополнительное поле age.<p>Псевдонимы позволяют в одном запросе получить данные для нескольких пользователей, присваивая уникальные имена каждому результату. Это упрощает структуру запросов, улучшает читаемость ответов и помогает избежать конфликтов имён при запросе одинаковых полей для разных объектов.</p>
88 { "data": { "user": { "id": "123", "name": "Иван Петров", "email": "ivanpetrov@example.com", "age": 30 } } } # Мы получили поля id, name и email из фрагмента UserBasicInfo, а также дополнительное поле age.<p>Псевдонимы позволяют в одном запросе получить данные для нескольких пользователей, присваивая уникальные имена каждому результату. Это упрощает структуру запросов, улучшает читаемость ответов и помогает избежать конфликтов имён при запросе одинаковых полей для разных объектов.</p>
89 <p>Порядок создания псевдонима:</p>
89 <p>Порядок создания псевдонима:</p>
90 <ul><li>Укажите желаемый псевдоним перед полем или запросом, после чего поставьте двоеточие.</li>
90 <ul><li>Укажите желаемый псевдоним перед полем или запросом, после чего поставьте двоеточие.</li>
91 <li>После двоеточия напишите оригинальное имя поля или запроса.</li>
91 <li>После двоеточия напишите оригинальное имя поля или запроса.</li>
92 <li>При необходимости используйте фигурные скобки для группировки полей.</li>
92 <li>При необходимости используйте фигурные скобки для группировки полей.</li>
93 </ul><p>Пример создания псевдонимов:</p>
93 </ul><p>Пример создания псевдонимов:</p>
94 { userInfo: user(id: "123") { fullName: name contactEmail: email } } # userInfo -- псевдоним для запроса user. # fullName -- для поля name. # contactEmail -- для поля email.<p>Ответ сервера на запрос с псевдонимами:</p>
94 { userInfo: user(id: "123") { fullName: name contactEmail: email } } # userInfo -- псевдоним для запроса user. # fullName -- для поля name. # contactEmail -- для поля email.<p>Ответ сервера на запрос с псевдонимами:</p>
95 { "data": { "userInfo": { "fullName": "Иван Петров", "contactEmail": "ivanpetrov@example.com" } } }<p>Директивы - это инструменты, управляющие выполнением запроса. Они позволяют гибко включать или исключать поля в зависимости от условий.</p>
95 { "data": { "userInfo": { "fullName": "Иван Петров", "contactEmail": "ivanpetrov@example.com" } } }<p>Директивы - это инструменты, управляющие выполнением запроса. Они позволяют гибко включать или исключать поля в зависимости от условий.</p>
96 <p>В GraphQL есть несколько основных типов директив:</p>
96 <p>В GraphQL есть несколько основных типов директив:</p>
97 <ul><li>@include - включает поле в результат, если условие истинно.</li>
97 <ul><li>@include - включает поле в результат, если условие истинно.</li>
98 <li>@skip - пропускает поле, если условие истинно.</li>
98 <li>@skip - пропускает поле, если условие истинно.</li>
99 <li>@deprecated - помечает поле как устаревшее.</li>
99 <li>@deprecated - помечает поле как устаревшее.</li>
100 <li>@specifiedBy - указывает URL спецификации для пользовательского скалярного типа.</li>
100 <li>@specifiedBy - указывает URL спецификации для пользовательского скалярного типа.</li>
101 </ul><p>Помимо этого, GraphQL позволяет создавать пользовательские директивы</p>
101 </ul><p>Помимо этого, GraphQL позволяет создавать пользовательские директивы</p>
102 <p>для специфических нужд конкретного API.</p>
102 <p>для специфических нужд конкретного API.</p>
103 <p>Порядок создания пользовательской директивы:</p>
103 <p>Порядок создания пользовательской директивы:</p>
104 <ul><li>Определите директиву в схеме GraphQL, используя ключевое слово directive.</li>
104 <ul><li>Определите директиву в схеме GraphQL, используя ключевое слово directive.</li>
105 <li>Укажите имя директивы начиная с символа @.</li>
105 <li>Укажите имя директивы начиная с символа @.</li>
106 <li>Если нужно, определите аргументы директивы.</li>
106 <li>Если нужно, определите аргументы директивы.</li>
107 <li>Укажите область применения директивы: поля (FIELD_DEFINITION), фрагменты (FRAGMENT_DEFINITION), операции (QUERY, MUTATION, SUBSCRIPTION) или другие элементы схемы (например, SCHEMA, SCALAR, OBJECT, INTERFACE, UNION, ENUM, INPUT_OBJECT).</li>
107 <li>Укажите область применения директивы: поля (FIELD_DEFINITION), фрагменты (FRAGMENT_DEFINITION), операции (QUERY, MUTATION, SUBSCRIPTION) или другие элементы схемы (например, SCHEMA, SCALAR, OBJECT, INTERFACE, UNION, ENUM, INPUT_OBJECT).</li>
108 </ul><p>Создадим директиву @auth, применимую к определениям полей и объектов. Эта директива принимает необязательный аргумент requires типа Role, который определяет возможные роли пользователей в системе. Если аргумент не указан, его значение по умолчанию устанавливается как USER. Такая директива позволит нам настраивать уровни доступа к различным полям или объектам в схеме GraphQL:</p>
108 </ul><p>Создадим директиву @auth, применимую к определениям полей и объектов. Эта директива принимает необязательный аргумент requires типа Role, который определяет возможные роли пользователей в системе. Если аргумент не указан, его значение по умолчанию устанавливается как USER. Такая директива позволит нам настраивать уровни доступа к различным полям или объектам в схеме GraphQL:</p>
109 directive @auth(requires: Role = USER) on FIELD_DEFINITION | OBJECT enum Role { ADMIN USER GUEST }<p>Применим нашу директиву, добавив @auth к полю email. После этого только пользователи с ролью ADMIN смогут видеть email-адреса других пользователей:</p>
109 directive @auth(requires: Role = USER) on FIELD_DEFINITION | OBJECT enum Role { ADMIN USER GUEST }<p>Применим нашу директиву, добавив @auth к полю email. После этого только пользователи с ролью ADMIN смогут видеть email-адреса других пользователей:</p>
110 type User { id: ID! name: String! email: String! @auth(requires: ADMIN) }<p>Для дальнейшего изучения GraphQL рекомендуем следующие ресурсы:</p>
110 type User { id: ID! name: String! email: String! @auth(requires: ADMIN) }<p>Для дальнейшего изучения GraphQL рекомендуем следующие ресурсы:</p>
111 <ul><li><a>Официальный сайт GraphQL</a> - здесь вы найдёте документацию, примеры использования технологии и материалы для новичков.</li>
111 <ul><li><a>Официальный сайт GraphQL</a> - здесь вы найдёте документацию, примеры использования технологии и материалы для новичков.</li>
112 <li><a>Awesome GraphQL</a> - это обновляемый репозиторий на GitHub с обширным списком ресурсов, библиотек и инструментов для GraphQL. Здесь вы найдёте ссылки на статьи, видео, серверные и клиентские реализации, а также примеры проектов.</li>
112 <li><a>Awesome GraphQL</a> - это обновляемый репозиторий на GitHub с обширным списком ресурсов, библиотек и инструментов для GraphQL. Здесь вы найдёте ссылки на статьи, видео, серверные и клиентские реализации, а также примеры проектов.</li>
113 <li><a>Apollo GraphQL Tutorials</a> - это руководство по Apollo, популярной реализации GraphQL для клиента и сервера. Apollo упрощает интеграцию GraphQL в приложения за счёт готовых решений для кэширования, управления состоянием и оптимизации запросов.</li>
113 <li><a>Apollo GraphQL Tutorials</a> - это руководство по Apollo, популярной реализации GraphQL для клиента и сервера. Apollo упрощает интеграцию GraphQL в приложения за счёт готовых решений для кэширования, управления состоянием и оптимизации запросов.</li>
114 </ul><p>* Решением суда запрещена "деятельность компании Meta Platforms Inc. по реализации продуктов - социальных сетей Facebook и Instagram на территории Российской Федерации по основаниям осуществления экстремистской деятельности".</p>
114 </ul><p>* Решением суда запрещена "деятельность компании Meta Platforms Inc. по реализации продуктов - социальных сетей Facebook и Instagram на территории Российской Федерации по основаниям осуществления экстремистской деятельности".</p>
115 <a>Научитесь: Профессия Фронтенд-разработчик + ИИ Узнать больше</a>
115 <a>Научитесь: Профессия Фронтенд-разработчик + ИИ Узнать больше</a>