Использование URLSession с Async/Await для сетевых запросов в Swift
В современном Swift программировании работа с сетью становится проще и удобнее благодаря async/await. Вместо использования устаревших замыканий (completion handlers) теперь можно писать асинхронный код, который легче читать и поддерживать.
В этой статье мы разберем, как использовать URLSession для выполнения сетевых запросов с async/await, обработку ошибок и декодирование JSON-ответов.
📌 Зачем использовать async/await с URLSession?
До появления async/await работа с URLSession требовала использования замыканий, что приводило к вложенному коду (callback hell). Теперь же код становится линейным и понятным, а ошибки можно обрабатывать через try/catch.
1 Выполнение GET-запроса
Допустим, нам нужно получить данные с сервера. Для этого используем URLSession.shared.data(from:):
Что здесь происходит?
- Мы создаем URL для запроса.
- URLSession.shared.data(from:) выполняет запрос и возвращает данные.
- Используем try await, чтобы дождаться результата запроса.
- В случае ошибки catch перехватит её и выведет сообщение.
Важно! Даже если сервер вернет 404 Not Found, ошибки не будет, так как URLSession не проверяет коды ответа.
2 Добавление параметров в GET-запрос
Часто требуется передавать параметры в URL (например, ?name=John&age=30). Для этого используем URLComponents:
🔹 Что делает этот код?
- Используем URLComponents, чтобы удобно добавлять параметры.
- Проверяем, что urlComponents.url не nil.
- Выполняем GET-запрос через URLSession.
3 Выполнение POST-запроса
POST-запросы обычно содержат тело (body) с JSON-данными. Рассмотрим, как отправить JSON-запрос:
🔹 Что происходит в этом коде?
- Создаем структуру PostData, которая соответствует JSON.
- Настраиваем URLRequest: указываем httpMethod = "POST".
- Кодируем структуру в JSON с помощью JSONEncoder().
- Указываем заголовок Content-Type: application/json.
- Отправляем запрос через URLSession.shared.data(for:).
4 Декодирование JSON-ответа
Допустим, сервер вернул JSON вида:
Чтобы его обработать, создаем структуру и декодируем ответ:
5 Обработка ошибок
Лучше всего использовать enum с типизированными ошибками, чтобы сделать код надежнее:
📌 Что мы сделали?
- Проверяем код ответа (200-299).
- Используем try/catch для обработки разных типов ошибок (кодирования, декодирования, сетевых сбоев).
- Выбрасываем NetworkingError, чтобы вызывающий код мог корректно обработать ошибку.
Заключение
Использование async/await с URLSession делает работу с сетью проще и надежнее. Мы рассмотрели:
✅ GET-запросы с параметрами
✅ POST-запросы с JSON-данными
✅ Декодирование JSON-ответов
✅ Обработку ошибок
Теперь вы готовы писать чистый и понятный код для сетевых запросов в Swift! 🚀