Site icon AppTractor

Обработка сетевых вызовов в Swift с помощью Moya

Moya — это сетевая библиотека Swift, построенная поверх Alamofire. Она выполняет сетевые вызовы без непосредственного взаимодействия с Alamofire и ориентирована на выполнение сетевых запросов типобезопасным способом с использованием перечислений (например, enum).

Почему именно Moya?

Вы умный разработчик и, вероятно, используете Alamofire для абстрагирования доступа к URLSession от всех тех неприятных деталей, которые вас не особо волнуют. Но затем, как и многие умные разработчики, вы также пишете слои абстракции для своих вариантов работы с сетью. Их, вероятно, называют APIManager или NetworkModel, и они всегда заканчиваются страданиями.

Как это исправить?

Moya предоставляет нам абстракцию для выполнения сетевых вызовов без прямого взаимодействия с Alamofire и позволяет в кратчайшие сроки сосредоточиться на основных функциях вашего приложения вместо того, чтобы работать с сетью.

Специфические сетевые уровни часто встречаются в приложениях для iOS. Они плохи по нескольким причинам:

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

Особенности Moya:

Установка

Вы можете интегрировать 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 в вашем следующем проекте.

Исходники проекта доступны на GitHub.

Источник

Exit mobile version