Найти тему
Nuances of programming

Как проще всего выполнять запросы GraphQL в iOS

Оглавление

Источник: Nuances of Programming

Такие сторонние библиотеки, как Apollo iOS client и AWS AppSync нужны для связи с сервером GraphQL в iOS-приложении, но они также вводят в ваш проект лишний код.

Клиент Apollo iOS нормализует результаты запросов для построения клиентского кэша с помощью базы данных SQLite. АWS AppSync снабжает клиент Apollo некоторыми дополнительными функциями для выполнения проверки подлинности AWS.

Я всегда чувствую себя неуверенно, когда связываю свой проект со сторонними библиотеками.

Поводы для беспокойства здесь следующие:

  • Насколько безопасна библиотека?
  • Что если библиотеку перестанут поддерживать?
  • Сколько времени уходит у команды поддержки на то, чтобы исправить ошибку и выпустить патч?
  • Кто же сообщает клиентам, что не может исправить ошибку по вине третьей стороны?

По счастью, есть простой и легкий способ выполнять GraphQL с помощью необработанного HTTP-запроса.

В этой статье продемонстрирую его пошаговую настройку (на основе Star War GraphQL API).

1.Операция query

-2

В GraphQL есть три типа операций: query, mutation и subscription.

Запрос query извлекает данные из API. Это можно выполнить HTTP-методом GET или POST в зависимости от API GraphQL.

Для API Star War GraphQL применяется метод POST.

Далее приведен пример формы для стандартного POST-запроса GraphQL. Тип содержимого в этом запросе  —  application/json. А форма  —  это его тело, закодированное в JSON-формате.

{
"query": "...",
"variables": { "myVariable": "someValue", ... }
}

Начнем со строки query.

2.Строка query

В теле запроса это выглядит так:

  • Здесь определяется строка запроса на получение фильмов с помощью фильтра.
  • Ключевое слово query в строке определяет тип операции, которая будет выполнена.
  • allFilms  —  это название операции. Оно не обязательно, но значимое и недвусмысленное имя помогает идентифицировать операцию.
  • $filter  —  это одна из переменных, принимаемых запросом, за которой следует тип фильтра Filter. Можно также передать другую переменную, а не создавать ее в запросе.
  • Блок fields описывает конкретные поля, которые мы запрашиваем, и имеет ту же форму, что и то, что мы получаем из API GraphQL.

3.Кодируемые переменные

Как сказано в документации Star War GraphQL API, дополнения запроса allFilms таковы:

Они полностью опциональны. Продемонстрируем на примере Filter:

У Filter, в свою очередь, тоже существует несколько опциональных свойств. Мы берем director только для упрощения демонстрационного кода.

Структуры Filter и Variable принимают протокол Encodable для подготовки тела в формате JSON.

4.Создание HTTP-запроса

Давайте разбираться:

  • Структура Payload содержит variables и query. Она также перенимает протокол Encodable.
  • request представляет собой экземпляр URLRequest, встроенный в Star War API URL: https://swapi.graph.cool.
  • payload кодируется в формате JSON и добавляется к телу запроса request.
  • Метод POST задействован согласно требованию Star War GraphQL API.
  • Для значений Content-Type and Accept в поле заголовка HTTP используется application/json.
  • request просто запускается одновременно с общим экземпляром URLSession.
  • Ответные данные находятся в формате JSON и могут быть десериализованы посредством JSONSerialization.

Заключение

В этой статье описывается наиболее облегчённый способ взаимодействия со службой GraphQL. Необработанный HTTP-запрос устраняет необходимость каких бы то ни было сторонних библиотек. Быстрый и чистый код целиком находится под контролем разработчика.

Ресурсы

Все сторонние библиотеки, API GraphQL и образцы кода Swift можно найти по следующим ссылкам:

Читайте также:

Читайте нас в Telegram, VK

Перевод статьи: Eric Yang, “The Easiest Way to Perform GraphQL Queries in iOS”