Connect with us

Разработка

Как использовать URLSession с Async/Await для сетевых запросов в Swift

Современные API Swift в сочетании с URLSession и async/await позволяют написать надежный сетевой слой, не нуждаясь в сторонних зависимостях.

Опубликовано

/

     
     

URLSession позволяет выполнять сетевые запросы и становится еще более мощным благодаря API async/await. Вы можете запросить данные с целевого URL и спарсить их в декодированную структуру перед отображением в представлении.

Популярные фреймворки, такие как Alamofire, стремятся упростить выполнение запросов, но для многих приложений можно обойтись и без сторонних решений. В этой статье мы расскажем об основах выполнения API-запросов и декодирования JSON-данных с помощью Swift Concurrency.

Выполнение сетевого запроса с помощью async/await

Вы можете использовать URLSession для выполнения запросов по заданному URL следующим образом:

Мы получаем данные для обычного URL-адреса, и в случае успешного выполнения запроса мы получаем обратно данные и объект ответа. Этот метод также будет успешным, если запрос вернет недействительный код состояния. Например, запрос 404 not found все равно приведет к получению данных и объекта ответа без выброса ошибки.

Передача аргументов в GET-запросе

В примере выше представлен простой GET-запрос без параметров. Мы можем добавить параметры с помощью URLComponents:

В приведенном выше примере получается следующий URL с закодированными параметрами:

https://httpbin.org/get?age=33&name=Antoine%20van%20der%20Lee

Выполнение POST-запроса с параметрами

POST-запрос работает по-другому и требует настройки метода HTTP. Мы должны закодировать параметры как JSONи настроить заголовок content-type. В целом код выглядит следующим образом:

Я рекомендую использовать структуру для определения параметров, чтобы сделать ваш код менее подверженным ошибкам. Для приведенного выше примера структура выглядит следующим образом:

Декодирование ответов JSON в Decodable структуру

Теперь, когда мы знаем, как отправлять данные, пришло время заняться декодированием JSON-ответов. Я всегда проверяю сетевой трафик с помощью симулятора Xcode, так что в процессе разработки я могу быстро просмотреть возвращаемый JSON:

Как использовать URLSession с Async/Await для сетевых запросов в Swift

Запросы, запущенные через URLSession с помощью async/await, можно проверить с помощью RocketSim

Замечательно то, что RocketSim всегда будет работать в фоновом режиме, поэтому вы также можете использовать его для проверки сетевых запросов, которые неожиданно завершились неудачей. Представьте, сколько времени вы сэкономите, если не будете искать, как воспроизвести сбой запроса!

Мы можем декодировать данный JSON-ответ с помощью JSON-декодера. Чтобы это сработало, нам сначала нужно определить JSON-ответ как декодируемую структуру:

Во-вторых, мы можем использовать полученные данные и декодировать их следующим образом:

Этот же код работает и для ранее показанного GET-запроса.

Оптимизация обработки ошибок URLSession

До сих пор мы выбрасывали ошибку, если что-то шло не так. Однако мы не проверяли недействительные коды ответов и не использовали преимущества типизированных ошибок. Хотя в обработке ошибок можно пойти на крайние меры, я хотел бы показать пример, в котором мы проверяем код состояния ответа и выбрасываем один тип ошибки, чтобы упростить обработку ошибок на вызывающей стороне:

Вы можете обобщить этот код для нескольких запросов, но идея обработки ошибок ясна. Мы отлавливаем конкретные типы ошибок и направляем их в ново определенный NetworkingError:

Этот пример демонстрирует возможности типизированных ошибок и обработки разных вариантов ошибок. Если статус выходит за пределы диапазона от 200 до 299, мы выбрасываем ошибку с недопустимым кодом состояния, которая будет пропущена через операторы catch. В целом, теперь мы можем сосредоточиться на переборе конкретных типов NetworkingError на нашей стороне.

Заключение

Современные API Swift в сочетании с URLSession и async/await позволяют написать надежный сетевой слой, не нуждаясь в сторонних зависимостях. В идеале вы должны написать (персональный) SDK, чтобы вы могли повторно использовать свой сетевой слой для любого приложения, которое вы создали (более подробно я объясняю это здесь).

Источник

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Telegram

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: