Автор оригинала: David Wong.
Статья была направлена профессиональному сообществу разработчиков Laravel с оригинальной ссылкой: https://learnku.com/ларавель/т…
Эта тема уже некоторое время обсуждается в сообществе разработчиков. У людей разные мнения и мнения по этому поводу. Какой из них мне следует использовать? Есть много вещей, которые нужно развивать, но энергичные новые участники или опытные старые участники? Перед этим давайте познакомимся с REST и GraphQL.
Что такое ОТДЫХ?
REST-это передача репрезентативного состояния (REST), которая соответствует определенным рекомендациям и является ограничением реализации веб-API. Это стиль архитектуры программного обеспечения, предложенный доктором Роем Филдингом в его докторской диссертации. Это побуждает клиентов и серверы обмениваться информацией в режиме без сохранения состояния. Имейте в виду, что не все API являются REST, но все службы RESTful являются API.
Что такое GraphQL?
GraphQL-это язык запросов веб-API. Он был создан Facebook в 2012 году и с открытым исходным кодом в 2015 году. Это не является ни архитектурным шаблоном, ни веб-сервисом. Это посредник, который запрашивает данные, полученные из различных источников данных. Этими источниками данных могут быть базы данных или веб-службы.
С годами REST стал стандартом де-факто веб-API. Поскольку он использует стандартные методы HTTP (GET, POST, PUT, DELETE и т.д.), С увеличением числа веб-приложений в Интернете он также был разработан и популяризирован. Кроме того, его язык не зависит от платформы, что делает его лучшим выбором для создания веб-сервисов. Поскольку все данные считаются ресурсом, отправляемым при вызове URL-адреса, их можно даже вызвать с помощью веб-браузера или с помощью запроса cURL.
Недостатки ОТДЫХА
Хотя REST очень успешен, его недостатки становятся очевидными из-за растущего масштаба и сложности услуг RESTful.
1. Мультиплекс (множественное взаимодействие данных)
В службах RESTful URL-адрес представляет ресурс. Поэтому, когда вы хотите получить несколько ресурсов, вам нужно запросить несколько разных URL-адресов, что приводит к нескольким взаимодействиям с данными.
Когда мы думаем о приложении для блога. Под блогом есть много комментариев. Обычно мы вызываем следующие URL-адреса
GET/posts/- Get specific blog posts GET/posts/ /comments - Get all the comments associated with the blog post above GET/posts/ /comments/ - Get specific comments on specific blogs
Вы обнаружите, что у нас есть гораздо больше URL-адресов для запроса. Это связано с тем, что отношения между сущностями (которые здесь можно понимать как блоги и комментарии) являются более сложными. По мере того как приложения становятся все более и более сложными, управлять этими API становится все сложнее.
2. Данные о чрезмерном приобретении/после приобретения
Иногда, когда вы запрашиваете интерфейс API, вы получаете ненужные данные и связанные с ними данные. Иногда вы не получаете достаточного количества данных, поэтому в конечном итоге вам приходится много раз ходить туда и обратно. Это распространенная проблема в службах RESTful. В некоторых случаях вам может потребоваться всего 2-3 значения, но в ответ вы можете получить около 20-25 значений. Это приведет только к передаче больших объемов неиспользуемых данных за счет увеличения времени отклика. В последнем случае вам может потребоваться больше информации, чем вы можете получить по одному URL-адресу, поэтому необходимо сделать несколько раундов. Это также приводит к увеличению временных затрат клиентов на получение всех необходимых данных.
3. Управление версиями API
Управление версиями API – это способ избежать повреждения клиентских приложений изменениями формата ответа. При изменении формата ответа API создается новая версия. Это делается для того, чтобы рабочие клиентские приложения могли работать должным образом и предоставить разработчикам некоторое время для перехода на новую версию API.
Но этот контроль версий является проблемой, потому что, когда выпускается новая версия, это означает новый URL-адрес. Обслуживание и использование API становится затруднительным и часто приводит к дублированию кода.
4. слабый тип
Не все данные, которые мы получаем от служб RESTful, строго типизированы, то есть они неправильно предоставляют конкретные данные. Это становится проблемой при записи API-интерфейсов, потому что мы должны указать тип данных, который клиент может ожидать, вызвав URL-адрес.
5. Клиент находится в неведении
До получения структуры ответа клиент не знает структуру ответа. Итак, клиент находится в неведении. Это часто может привести к ошибкам и данным, которые не могут быть правильно обработаны, тем самым снижая надежность использования API.
Преимущества GraphQL
GraphQL был изобретен Facebook для преодоления недостатков REST.
1. Один запрос получает все
Служба GraphQL предоставляет только одну конечную точку, чтобы клиент мог передавать необходимые запросы для извлечения данных. Используя тот же пример, рассмотренный ранее, давайте рассмотрим запрос GraphQL
{
findPost(id: ) {
id
title
content
author
comments {
id
comment
commentedBy
}
}
}
Как вы можете видеть, мы получаем все необходимые данные только по одному запросу. Поэтому, когда вам нужно новое поле, вам просто нужно добавить его в запрос, и оно появится в ответе.
2. сильный тип
GraphQL управляется строго типизированными шаблонами. Эти типы могут быть примитивными или производными. Строго типизированные системы позволяют API-интерфейсам быть самодокументированными, чтобы клиенты знали, какие ответы они получат при запросе конкретного запроса.
3. Драйвер клиента
GraphQL предоставляет клиентам декларативный синтаксис для точного указания необходимых им полей. Это исключает возможность избыточности и неадекватности данных из-за того, что клиент объявляет свои требования к данным серверу GraphQL в соответствии со схемой.
4. Эволюция API
Поскольку все в GraphQL управляется схемой, новые поля не влияют на существующие поля, и GraphQL также предоставляет удаленные поля. @устарело Аннотации, поэтому расширение GraphQL не является проблемой. Это устраняет необходимость в контроле версий API.
5. Агностичность транспортного слоя
Это большое преимущество GraphQL. Серверы API могут обмениваться информацией по таким протоколам, как HTTP, HTTPS, WebSockets, TCP, UDP и т.д. Это связано с тем, что GraphQL редко заботится о том, как происходит обмен информацией между клиентом и сервером.
Недостатки GraphQL
Вау, GraphQL-это здорово. Это хорошо известный факт. Но все в мире несовершенно, и GraphQL не может выделиться.
1. Кэширование является незрелым
GraphQL не поддерживает кэширование браузера и мобильного телефона, что отличается от сервисов RESTful, использующих локальный механизм кэширования HTTP, поэтому нам необходимо приложить дополнительные усилия для достижения кэширования GraphQL. Хотя такие инструменты, как Relay, обеспечивают некоторую поддержку кэширования, они недостаточно развиты для механизма кэширования, используемого службами RESTful.
2. Проверка и сообщение об ошибках
Службы RESTful используют коды состояния HTTP для обработки различных ошибок, которые могут возникнуть. Для разработчиков это делает тестирование API очень простым и легким. Но использование сервисов GraphQL всегда возвращает 200 ОК Ответ. Типичное сообщение об ошибке GraphQL выглядит следующим образом, с кодом состояния 200 OK 。
{
errors: [
{
message: 'Some error occurred'
}
]
}
Это очень усложняет обработку сценариев ошибок и делает процесс проверки очень громоздким.
3. Схемы воздействия и атаки на ресурсы
В отличие от служб RESTful, службы GraphQL требуют, чтобы клиенты знали схему данных для запроса. Если вы предоставляете API-интерфейсы третьим лицам, вы в основном предоставляете свои внутренние структуры данных. Необходимо соблюдать осторожность, поскольку клиент может инициировать запросы на подключение без больших затрат, что может привести к атакам типа “отказ в обслуживании” (DoS) на сервере.
4. Безопасность – Аутентификация и Авторизация
Сообщество GraphQL все еще не понимает, как работать с компонентами безопасности служб GraphQL. До сих пор не существует собственного решения для интеграции аутентификации и авторизации. Обычно для авторизации пользователей он абстрагируется на уровень бизнес-логики, но действительно ли нам нужно анализировать и проверять запрос пользователя, не прошедшего проверку подлинности, все еще остается вопросом в домене GraphQL.
5. Проблема с N + 1 запросом
В службах RESTful легко записывать и дополнительно оптимизировать выполняемые SQL-запросы. Однако в случае GraphQL синтаксический анализ носит динамический характер, поэтому трудно получить точные запросы и дополнительно оптимизировать их. Иногда анализаторы полей могут вызывать проблемы с запросами N + 1 и сложные операции соединения. Но Facebook разрабатывает такие инструменты, как DataLoader, для решения именно этой проблемы. Так что, возможно, в будущем это не будет недостатком.
6. Молодая Экология
GraphQL очень похож на ребенка в этой экосистеме API, что означает, что проблемы и разрушительные изменения могут произойти в любое время, поэтому мы должны быть очень осторожны при использовании любой библиотеки или модуля, связанного с GraphQL.
резюме
Прежде всего, я хочу сказать, что GraphQL-это всего лишь инструмент, а REST-это архитектурный шаблон. Было бы большой ошибкой заменять REST на GraphQL. Но в эту эпоху микросервисов мы разделяем API и создаем их на атомарном уровне. Мы можем воспользоваться этими двумя преимуществами, потому что нет серебряной пули.
Службы GraphQL уделяют приоритетное внимание производительности, в то время как службы RESTful поддерживают надежность.
Узлы GraphQL могут быть представлены как узлы с помощью существующих служб RESTful, таких как /graphql Он может использоваться в качестве шлюза для выполнения запросов GraphQL, а также может поддерживать узлы REST для некоторых сценариев.
В некоторых сценариях лучше использовать GraphQL, а в некоторых сценариях REST обязательно лучше. Поэтому, прежде чем мы скажем, какой из них лучше, нам нужно проанализировать соответствующие требования и данные, прежде чем мы узнаем, какой из них лучше.
Оригинал: “https://developpaper.com/api-interface-design-how-to-choose-graphql-and-rest/”