REST API

REST API против GraphQL

REST API против GraphQL

TL; версия DR

В одном из предыдущих постов мы вкратце обсудили, каково использовать GitHub API v3. Эта версия предназначена для взаимодействия, как и любой другой REST API. Есть конечные точки для каждого ресурса, к которому вам нужно получить доступ и / или изменить. Есть конечные точки для каждого пользователя, каждой организации, каждого репозитория и т. Д. Например, у каждого пользователя есть конечная точка API по адресу https: // api.github.com / users / вы можете попробовать подставить свое имя пользователя вместо и введите URL-адрес в браузере, чтобы увидеть, что API отвечает.

GitHub API v4, с другой стороны, использует GraphQL, где QL означает язык запросов. GraphQL - это новый способ разработки ваших API. Точно так же, как существует множество веб-сервисов, предлагаемых как REST API, а не только тех, что предлагаются GitHub, существует множество веб-сервисов, которые позволяют взаимодействовать с ними через GraphQL.

Самая резкая разница между GraphQL и REST API, которую вы заметите, заключается в том, что GraphQL может работать без единой конечной точки API. В случае GitHub API v4 эта конечная точка - https: // api.github.com / graphql и все. Вам не нужно беспокоиться о добавлении длинных строк в конец корневого URI или предоставлении параметра строки запроса для дополнительной информации. Вы просто отправляете аргумент типа JSON этому API, запрашивая только то, что вам нужно, и вы получаете обратно полезную нагрузку JSON с той же самой информацией, которую вы запрашивали. Вам не нужно заниматься фильтрацией нежелательной информации или снижать производительность из-за больших ответов.

Что такое REST API?

Что ж, REST означает передачу репрезентативного состояния, а API - интерфейс прикладного программирования. REST API, или RESTful API, стал основной философией дизайна, лежащей в основе большинства современных клиент-серверных приложений. Идея возникает из-за необходимости разделить различные компоненты приложения, такие как пользовательский интерфейс на стороне клиента и логика на стороне сервера.

Таким образом, сеанс между клиентом и сервером обычно не имеет состояния. После загрузки веб-страницы и связанных скриптов вы можете продолжать взаимодействовать с ними, и когда вы выполняете действие (например, нажимаете кнопку отправки), тогда отправляется запрос на отправку вместе со всей контекстной информацией, необходимой веб-серверу для обработки этого запроса ( например имя пользователя, токены и т. д.). Приложение переходит из одного состояния в другое, но без постоянной необходимости соединения между клиентом и сервером.

REST определяет набор ограничений между клиентом и сервером, и связь может происходить только при этих ограничениях. Например, REST через HTTP обычно использует модель CRUD, которая означает создание, чтение, обновление и удаление, а методы HTTP, такие как POST, GET, PUT и DELETE, помогают выполнять эти операции и только эти операции. Старые методы вторжения, такие как SQL-инъекции, невозможны с чем-то вроде четко написанного REST API (хотя REST не является панацеей безопасности).

Это также очень помогает разработчикам пользовательского интерфейса! Поскольку все, что вы получаете из HTTP-запроса, является типичным потоком текста (иногда в формате JSON), вы можете легко реализовать веб-страницу для браузеров или приложения (на предпочитаемом вами языке), не беспокоясь об архитектуре на стороне сервера. Вы читаете документацию по API для таких сервисов, как Reddit, Twitter или Facebook, и можете писать расширения для них или сторонних клиентов на выбранном вами языке, поскольку вам гарантируется, что поведение API останется прежним.

И наоборот, серверу все равно, написан ли интерфейс на Go, Ruby или Python. Будь то браузер, приложение или интерфейс командной строки. Он просто «видит» запрос и отвечает соответствующим образом.

Что такое GraphQL?

Как и все в мире компьютеров, REST API становились все больше и сложнее, и в то же время люди хотели реализовать и использовать их быстрее и проще. Вот почему Facebook придумал идею GraphQL, а позже открыл ее. QL в GraphQL означает язык запросов.

GraphQL позволяет клиентам делать очень конкретные запросы API, вместо того, чтобы делать жесткие вызовы API с предопределенными параметрами и ответами. Это намного проще, потому что сервер тогда отвечает точно теми данными, которые вы его запрашивали, без лишнего.

Взгляните на этот запрос REST и соответствующий ему ответ. Этот запрос предназначен для просмотра только общедоступной биографии пользователя.

Запрос: ПОЛУЧИТЬ https: // api.github.com / users /
Ответ:

"логин": "октокэт",
"id": 583231,
"node_id": "MDQ6VXNlcjU4MzIzMQ ==",
"avatar_url": "https: // avatars3.githubusercontent.com / u / 583231?v = 4 ",
"gravatar_id": "",
"url": "https: // api.github.ru / users / octocat ",
"html_url": "https: // github.com / octocat ",
"followers_url": "https: // api.github.ru / users / octocat / followers ",
"следующий_url": "https: // api.github.ru / users / octocat / following / other_user ",
"gists_url": "https: // api.github.ru / users / octocat / gists / gist_id ",
"starred_url": "https: // api.github.ru / users / octocat / starred / owner / repo ",
"subscriptions_url": "https: // api.github.ru / users / octocat / subscriptions ",
"organization_url": "https: // api.github.ru / users / octocat / orgs ",
"repos_url": "https: // api.github.com / users / octocat / repos ",
"events_url": "https: // api.github.ru / users / octocat / events / privacy ",
"Receive_events_url": "https: // api.github.ru / users / octocat / Received_events ",
"тип": "Пользователь",
"site_admin": ложь,
"name": "Октокот",
"компания": "GitHub",
"блог": "http: // www.github.com / blog ",
"location": "Сан-Франциско",
"электронная почта": нуль,
"наемный": нуль,
«биография»: ноль,
"public_repos": 8,
"public_gists": 8,
«подписчиков»: 2455,
«следующие»: 9,
"created_at": "2011-01-25T18: 44: 36Z",
"updated_at": "2018-11-22T16: 00: 23Z"

Я использовал имя пользователя octocat, но вы можете заменить его на имя пользователя по вашему выбору и использовать cURL, чтобы сделать этот запрос в командной строке или Postman, если вам нужен графический интерфейс. Хотя запрос был простым, подумайте обо всей дополнительной информации, которую вы получите из этого ответа. Если вам нужно было обработать данные миллиона таких пользователей и отфильтровать все ненужные данные, используя, то это неэффективно. Вы тратите пропускную способность, память и вычислительные ресурсы, чтобы получить, сохранить и отфильтровать все миллионы дополнительных пар ключ-значение, которые вам никогда не понадобятся

Кроме того, вы не знаете заранее структуру ответа. Этот ответ JSON эквивалентен объекту словаря в Python или объекту в JavaScript. Другие конечные точки ответят объектами JSON, которые могут состоять из вложенных объектов, вложенного списка внутри объекта или любой произвольной комбинации типов данных JSON, и вам нужно будет обратиться к документации, чтобы получить подробную информацию. Когда вы обрабатываете запрос, вы должны знать об этом формате, который меняется от конечной точки к конечной.

GraphQL не полагается на HTTP-глаголы, такие как POST, GET, PUT и DELETE, для выполнения операций CRUD на сервере. Вместо этого существует только один тип типа HTTP-запроса и endopint для всех операций, связанных с CRUD. В случае GitHub это включает запросы типа POST только с одной конечной точкой https: // api.github.com / graphql

Будучи запросом POST, он может нести с собой текст в формате JSON, через который будут выполняться наши операции GraphQL. Эти операции могут быть типа запрос если все, что он хочет, это прочитать некоторую информацию, или это может быть мутация в случае необходимости изменения данных.

Чтобы делать вызовы GraphQL API, вы можете использовать GitHub GraphQL explorer. Взгляните на этот GraphQL запрос для получения тех же данных (общедоступная биография пользователя), как мы делали выше, используя REST.

Запрос: POST https: // api.github.com / graphql
запрос
user (логин: "ranvo")
биография


 
Ответ:
 

"данные":
"Пользователь":
"bio": "Энтузиасты науки и техники. Я увлекаюсь всякими несвязанными вещами из
серверы квантовой физики.\ r \ nИногда я пишу в блоге сообщения о вышеуказанных интересах."


Как видите, ответ состоит только из того, что вы просили, это биография пользователя. Вы выбираете конкретного пользователя, передавая имя пользователя (в моем случае это Ранво), а затем вы запрашиваете значение атрибута этого пользователя, в данном случае этот атрибут биография. Сервер API ищет точную конкретную информацию и отвечает именно ею и ничем другим.

С другой стороны, GraphQL также позволяет вам сделать один запрос и извлечь информацию, которая потребовала бы нескольких запросов в традиционном REST API. Напомним, что все запросы GraphQL выполняются только к одной конечной точке API. Возьмем, к примеру, вариант использования, когда вам нужно запросить у сервера API GitHub биографию пользователя и один из его ключей SSH. Это потребует двух повторных запросов GET.

Запросы REST: GET https: // api.github.com //
ПОЛУЧИТЬ https: // api.github.com // ключи
 
Запрос GraphQL: POST https: // api.github.com / graphql /
 
запрос
user (логин: "ranvo")
биография
publicKeys (last: 1)
Edge
node
ключ





 
Ответ GraphQL:
 

"данные":
"Пользователь":
"bio": "Энтузиасты науки и техники. Я увлекаюсь всякими несвязанными вещами из
серверы квантовой физики.\ r \ nИногда я пишу в блоге сообщения о вышеуказанных интересах.",
"publicKeys":
"края": [

"узел":
«ключ»: «ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH31mVjRYdzeh8oD8jvaFpRuIgL65SwILyKpeGBUNGOT»


]



Есть вложенные объекты, но если вы посмотрите на свой запрос, они в значительной степени соответствуют вашему запросу, поэтому вы можете знать и, в некотором смысле, формировать структуру полученного ответа .

Заключение

GraphQL действительно имеет свою собственную кривую обучения, которая очень крутая или совсем не крутая, в зависимости от того, кого вы спрашиваете. С объективной точки зрения могу изложить вам следующие факты. Он гибкий, как вы видели выше, он интроспективен - то есть вы можете запросить GraphQL API о самом API. Даже если вы не собираетесь создавать свой сервер API, используя его, скорее всего, вам придется взаимодействовать с API, которое позволяет только GraphQL.

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

Shadow of the Tomb Raider для Linux Учебное пособие
Shadow of the Tomb Raider - двенадцатое дополнение к серии Tomb Raider - франшизе приключенческой игры, созданной Eidos Montreal. Игра была очень хоро...
Как увеличить FPS в Linux?
FPS означает Кадров в секунду. Задача FPS - измерить частоту кадров при воспроизведении видео или во время игры. Проще говоря, количество непрерывных ...
Лучшие игры Oculus App Lab
Если вы владелец гарнитуры Oculus, вы должны знать о загрузке неопубликованных приложений. Боковая загрузка - это процесс установки на гарнитуру содер...