Исходная ссылка: https://medium.com/@weblab_tech/graphql-everything-you-need-to-know-58756ff253d8
Автор оригинала: Weblab Technology
Переводчик: Ян Тао
Цель этого поста — указать основные функции, связанные с GraphQL, и обсудить сильные и слабые стороны конкретной спецификации API.
GraphQL часто называют технологией API, ориентированной на внешний интерфейс, поскольку он позволяет разработчикам внешнего интерфейса запрашивать данные гораздо проще, чем раньше. Facebook представил этот язык запросов с целью настройки клиентских приложений интуитивно понятным и масштабируемым способом для описания предварительных условий данных и взаимодействий. Самое приятное то, что этот язык запросов не привязан к какой-либо конкретной системе управления базами данных и поддерживается текущими форматами данных и кодировками.
Фундаментальная проблема с традиционным REST заключается в том, что клиенты не могут персонализировать сбор данных.. Кроме того, запуск и управление несколькими конечными точками представляет собой еще одну трудность, поскольку клиентам часто требуется получать данные с нескольких конечных точек.
При настройке сервера GraphQL для получения и изменения данных достаточно простого URL-адреса. Таким образом, пользователь может запросить набор данных с сервера, передав строку запроса и объявив, что ему нужно.
Здесь вы можете найти нашу личную практику, прежде чем мы продолжим.graphlql-example
GraphQL VS REST
Говоря о сходстве, REST и GraphQL используются для создания API. Кроме того, ими можно управлять через HTTP. Что касается различий, REST — это, прежде всего, структурированная концепция, ориентированная на программное обеспечение, без спецификации и явного набора инструментов. Это больше связано со стабильностью API, чем с производительностью. С другой стороны, GraphQL — это язык запросов, предназначенный для управления конечными точками через HTTP, повышающий производительность и удобство использования. Я бы даже сказал, что может показаться странным сравнивать языки запросов с архитектурным стилем совместной разработки веба :). Некоторые другие заметные отличия включают в себя:
сбор информации
Нет никаких сомнений, является одной из характеристик графики сбора данных наиболее ярких. Стандартным API REST для генерации и получения данных нам может потребоваться отправить запрос на несколько конечных точек. Напротив, GraphQL предоставляет данные одинарных серверов можно получить конечную точку
query {
books {
id
title
author
isbn
price
}
}
Помимо сбора данных
Поскольку каждый интерфейс содержит фиксированный формат данных в покое, он позволит вам получить более избыточные данные, чем GraphQL. Точно так же остальные отправляют дополнительные запросы для получения соответствующих данных. Для предыдущего примера GraphQL очень отличается. Поскольку это язык запроса и поддерживает декларативную выборку данных, пользователи могут получать только данные, которые им нужны с сервера.
query {
books {
title
price
}
}
Request: query { books { error_field } }
Response:
Request Method:POST
Status Code: 200 OK
{“errors”:[{“message”:”Cannot query field \”error_field\” on type \”Book\”.”,”category”:”graphql”,”locations”:[{“line”:3,”column”:3}]}]}
тайник
Версия
Контроль данных приведет к ограничению границ API, любое изменение будет рассматриваться как критическое изменение, а критические изменения требуют обновления версии API. Вероятно, поэтому большинство API выбирают управление версиями. Если новому API нужна последняя версия, нам нужно часто менять новый API на старый API. [Примечание переводчика: например, интерфейс меняет тип данных поля] Напротив, GraphQL возвращает только те данные, которые нам нужны, и получает последние типы данных и поля без изменения исходного запроса.
Устаревание легко
При использовании GraphQL вы можете легко объявить поле устаревшим. Пользователи GraphQL обязательно объявят нужные им поля.
‘author_name’ => [
‘type’ => Type::string(),
‘deprecationReason’ => ‘Deprecated. Use author field’,
],
API отдыха действуют по-разному. Хотя конечная точка API Basic Rest может получить, но не все конечные точки могут вернуть редкое поле. [Примечание переводчика: a. может содержать дополнительные поля] Напротив, GraphQL очень легко отслеживать использование определенных полей. Пользователи API могут развернуть, чтобы получить поля в конкретном клиенте.
оптимизация производительности
Запросы REST по умолчанию выполняются целиком, и GraphQL обычно старается отправлять как можно меньше запросов. Даже если каждый запрос REST возвращает самую основную часть, GraphQL может передавать больше фрагментов данных в той же ситуации.
Недостатки GraphQL
Кэширование GraphQL — это непросто
так какофициальная документацияОн объяснил,
Проблема аутентификации
N + 1 для обнаружения и решения проблем
Что такое проблема n+1?
Когда проблема N + 1 наиболее очевидна при выполнении проблем оптимизации задней части GraphQL, вы можете столкнуться.
Если вы не оптимизируете свои запросы GraphQL, вы можете выполнять несколько запросов в одном запросе. Без надлежащей системы кэширования и пакетной обработки сервер будет отвечать на запрос каждый раз, когда определяется поле. DataLoader, несомненно, является лучшим решением и может значительно повысить производительность серверной части, особенно на сервере GraphQL. Опишите задачу n+1 на простом примере.
query {
users {
name
education {
degree
year
}
age
address {
country
city
street
}
}
}
С помощью REST API легко оценивать, выявлять и решать n+1 проблему. Это отличается для GraphQL. К счастью, Facebook работает над решением этой проблемы с помощью DataLoader.
Что такое DataLoader
Как это работает?
DataLoader в основном использует пакетную обработку и кэширование. Он используется для массовой загрузки ответов на несколько вопросов/запросов от клиента. Кроме того, он может кэшировать ответы и разрешать им отвечать на последовательные запросы на аналогичные ресурсы.
GraphQL в запросах, мутациях и подписках
Queries
正如它的名字,Queries是客户端从服务端获取数据。和从多个端点返回详细信息的REST不一样,GraphQL只提供了一个端点,让客户端从预定义的框架决定它需要的数据。 Например:
{
Users {
name
}
}
{
“Users”: [
{“name”: “Damira”},
{“name”: “Michael”}
{“name”: “Salman”}
{“name”: “Sara”}
{“name”: “Maria”}
]
}
{
Users (last: 3) {
name
username
}}
До сих пор мы видели, как получить данные с сервера с помощью запроса. Теперь давайте рассмотрим способы создания, исключения, обновления данных в GraphQL.
Mutations
Мутации используются для создания, обновления или удаления данных. Его структура почти такая же, как у запросов, за исключением того, что в начале необходимо добавить поле «мутация». Например,
mutation {
createUser (name : “John”, username: ”jo123”){
name
username
}
}
Subscriptions
Подписки используются для установки и сохранения активных подключений к серверам. Это позволяет получать информацию о связанных событиях в режиме реального времени. В большинстве случаев клиентам необходимо подписаться на определенные события, чтобы получить соответствующие данные. пожалуйста, передайтеграфик up.org/learn/но день…Получить подробную информацию
Лучший из двух миров
существуетСтек в АоллоНекоторые решения можно найти.
Если у вас есть работающий проект, сложно быстро перейти с RESTful API на GraphQL. Но хорошая новость заключается в том, что вы можете пользоваться преимуществами обоих подходов. Например, вы можете использовать запросы GraphQL для рефакторинга способа получения данных во внешнем интерфейсе, а затем начать интеграцию. мутации. Это позволяет вам постепенно уменьшать действия в ваших контроллерах. Кроме того, вы можете долгое время сосуществовать в своем проекте с обоими подходами. Например, если вы хотите упростить механизм авторизации, вы всегда можете помочь с архитектурой REST.
Суммировать
немного полезной информации
https://github.com/weblab-technology/graphql-example
REST и веб-сервисы — Теоретически и на практике — Springer
by Oleksandr Knyga, Software Engineer Maksim Kolesnikov, DevOps Sergei Guliaev, Back-End Developer Viacheslav Eremin, Front-End Developer Sharmeen Hayat, author & Data Specialist Dima Dmytriienko, editor & Brand Specialist
Примечание переводчика
Некоторые проблемы с GraphQL, упомянутые в исходном тексте, вApollo GraphQLЭтот проект был решен в определенной степени, более чем плюс кеш.