Разработка
Обработка сетевых вызовов в Swift с помощью Moya
Moya предоставляет нам абстракцию для выполнения сетевых вызовов без прямого взаимодействия с Alamofire и позволяет в кратчайшие сроки сосредоточиться на основных функциях вашего приложения вместо того, чтобы работать с сетью.
Moya — это сетевая библиотека Swift, построенная поверх Alamofire. Она выполняет сетевые вызовы без непосредственного взаимодействия с Alamofire и ориентирована на выполнение сетевых запросов типобезопасным способом с использованием перечислений (например, enum).
Почему именно Moya?
Вы умный разработчик и, вероятно, используете Alamofire для абстрагирования доступа к URLSession от всех тех неприятных деталей, которые вас не особо волнуют. Но затем, как и многие умные разработчики, вы также пишете слои абстракции для своих вариантов работы с сетью. Их, вероятно, называют APIManager или NetworkModel, и они всегда заканчиваются страданиями.
Как это исправить?
Moya предоставляет нам абстракцию для выполнения сетевых вызовов без прямого взаимодействия с Alamofire и позволяет в кратчайшие сроки сосредоточиться на основных функциях вашего приложения вместо того, чтобы работать с сетью.
Специфические сетевые уровни часто встречаются в приложениях для iOS. Они плохи по нескольким причинам:
- Сложно писать новые приложения («как начать?»).
- Сложно поддерживать существующие приложения («о боже мой, этот беспорядок…»)
- Сложно писать модульные тесты («как мне сделать это снова?»)
Итак, основная идея Moya заключается в том, что нам нужен слой сетевой абстракции, который в основном работает на основе Alamofire. Это упростит выполнение обычных задач, но при этом обеспечит достаточную функциональность, чтобы можно было легко обрабатывать сложные запросы.
Особенности Moya:
- Проверка во время компиляции на правильность доступа к конечным точкам API.
- Четкое определение использования различных конечных точек с ассоциированными значениями enum.
- Предоставление Swift-first API/абстракций для выполнения сетевых запросов.
- Предоставление API для помощи в создании заглушек сетевых запросов.
- Обеспечение основы для декодирования ответов.
- Отдает предпочтение явно определенному поведению перед реализацией по умолчанию.
Установка
Вы можете интегрировать Moya в проект с помощью CocoaPods, Carthage или менеджера пакетов Swift.
Используйте эту ссылку для установки: https://github.com/Moya/Moya#installation.
Совет: всегда указывайте версии библиотек при установке зависимостей. Например, если вы используете Cocoapods, указывайте конкретный номер версии для вашего проекта!
pod ‘Moya’, ‘15.0’ # latest version at the time of writing.
Менеджер API
После установки библиотеки мы должны создать файл API.swift и создать enum (перечисление), включающее различные запросы. Мы должны расширить перечисление API с помощью TargetType от Moya и привести в соответствие необходимые переменные. Здесь есть baseURL, path, method, sampleData, task и headers.
Протокол целевого типа
Теперь, когда вы создали список API со всеми конечными точками, нам нужно импортировать Moya и соблюсти протокол Target Type. Давайте подробно рассмотрим приведенный выше фрагмент кода:
baseURL: Каждой цели (например, сервису) требуется базовый URL. Moya будет использовать его для создания правильного объекта Endpoint.
path: Путь после baseURL. Иногда нам нужно использовать динамическое значение. Например, чтобы получить информацию о фильме, мы должны поместить id пользователя в путь, например user/{userId}.
method: HTTP-метод запроса. Это может быть get, post, put, delete, connect, head, options, patch и trace.
sampleData: Вы можете создать макет/пробные данные для ответа для тестирования. Если вы не пишете никакого теста, вы можете вернуть пустые данные, как в коде.
task: Представляет собой HTTP-задачу. Она может содержать разные задачи, здесь мы обсудим несколько общих. Ожидается, что вы вернете перечисление task для каждой конечной точки, которую вы хотите использовать. Существует множество способов запроса информации, таких как простой запрос, запрос данных или запрос параметров. У вас также есть возможность загружать файлы или загружать запрос, и многое другое. Мы использовали requestPlain для получения сведений о пользователе, потому что запрос не требует дополнительных данных, здесь простой запрос get,
Мы должны использовать requestParameters, когда хотим передать параметры и определить свой собственный тип кодировки (посмотрите на пример ниже):
header: Заголовки, которые будут использоваться в запросе. Когда вам нужен заголовок для запроса, вы можете добавить заголовки в словарь.
Сетевой менеджер
Нам нужно создать модели ответов для отображения. Я использую https://app.quicktype.io для создания модели ответа из JSON. Я рекомендую этот инструмент для быстрого создания моделей отклика. Я создал модель User.
Вот модель User.swift и мы использовали Codable для парсинга JSON в модель.
Мы можем создать файл NetworkManager.swift для объявления всех API, которые мы собираемся использовать.
Мы должны создать новый класс, который расширяет определенный протокол. Для данного примера у нас всего 2 метода, и провайдер с API-файлом мне подходит. Если вам нужно отправить несколько запросов, файл API может запутаться. Вы можете создать различные API-файлы, например UserAPI, LoginAPI и т.д., и использовать различные провайдеры. Таким образом, это будет более организованно.
В Moya есть плагин под названием NetworkLoggerPlugin, который позволяет регистрировать запросы и ответы в консоли. Мы использовали этот плагин для просмотра логов запросов и ответов.
var provider = MoyaProvider<API>(plugins: [NetworkLoggerPlugin()])
Мы создали два общих метода запроса fetchUsers() и fetchUserDetail(). Оба метода одинаковы, за исключением модели ответа и запроса, и это также предотвращает дублирование кода.
Затем использовали тип Result, который есть в Swift 5. Тип Result реализован в виде перечисления, которое имеет два кейса: success и failure. Вы также можете создать свой собственный тип ошибки.
Выполнение вызова API
Мы можем получить экземпляр NetworkManager для использования менеджера.
Создаем объект NetworkManager и массив Users.
Теперь просто вызываем API, получаем необходимые данные из сервиса и отображаем их.
Заключение
- Использовать Moya для работы с сетью и Codable для разбора ответов JSON очень просто, но по мере роста размера вашего API, классы для работы с сетью растут вместе с ним, как и объем кода, который вам нужно написать. Чтобы сделать код более управляемым и простым в сопровождении, мы использовали наследование и обобщение, когда это было необходимо.
- Мы извлекли протокол BaseService, который будет использоваться всеми нашими перечислениями для определения API, и реализовали его общие свойства в виде расширения.
- Для сетевой части мы извлекли класс BaseNetwork, который обрабатывает ошибки, проверяет успешные ответы и преобразует тела ответов с помощью общих методов.
Надеюсь, вам понравилось прочитанное. Возможно, я убедил вас попробовать Moya в вашем следующем проекте.
Исходники проекта доступны на GitHub.
-
Новости1 месяц назад
Видеозвонки с Лили, Приключения и пианино — обновления Duolingo
-
Новости1 месяц назад
Видео и подкасты о мобильной разработке 2024.39
-
Видео и подкасты для разработчиков4 недели назад
Lua – идеальный встраиваемый язык
-
Новости4 недели назад
Poolside, занимающийся ИИ-программированием, привлек $500 млн