Alamofire е HTTP клиент за iOS, macOS, tvOS и watchOS, написан на езика Swift. Библиотеката автоматизира задачите по кодиране на параметри, валидиране на отговори и сериализация на данни. Според данните на GitHub хранилището на Alamofire, проектът се използва от повече от 40 000 приложения по целия свят. Alamofire се счита за де факто стандарт за мрежова комуникация в екосистемата на Apple.
Основни точки
Alamofire е библиотека за работа с HTTP заявки на платформите на Apple, написана изцяло на Swift. Разработката започва през 2014 г. като алтернатива на Objective-C библиотеката AFNetworking и бързо се превръща в стандарт за мрежова комуникация в iOS общността.
Библиотеката е изградена върху системната рамка URLSession, абстрахирайки нейното нисконивово API в кратки вериги от извиквания. Alamofire поддържа всички функции на URLSession: фонови сесии, прихващачи на заявки, SSL сертификати и няколко начина за сериализация на отговори.
Според Swift Package Index, Alamofire е в топ 10 на най-популярните Swift пакети с над 45 000 звезди в GitHub. Библиотеката е съвместима с iOS 10+, macOS 10.12+, tvOS 10+ и watchOS 3+.
Основното предимство на Alamofire пред директното използване на URLSession е намаляването на шаблонния код. Едно извикване на AF.request замества 15–20 реда ръчна конфигурация на URLRequest, обработка на отговор и декодиране на данни. В същото време библиотеката запазва пълна гъвкавост за нестандартни сценарии чрез персонализирани сесии и разширения.
Alamofire предоставя широк набор от функции за работа с мрежа, които покриват повечето сценарии за разработка на мобилни приложения. Благодарение на модулната архитектура, разработчикът свързва само необходимите компоненти.
HTTP методите GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS и TRACE са имплементирани чрез унифициран API. Всеки метод приема параметри на заявката, хедъри и връща отговор под формата на Result тип. Разработчикът не трябва ръчно да конфигурира URLRequest — библиотеката прави това автоматично въз основа на подадените аргументи.
Валидирането на отговори в Alamofire позволява проверка на кодовете на състояние и съдържанието на отговора преди предаване на данни към приложението. Библиотеката поддържа персонализирани условия за валидиране чрез closures, което дава пълен контрол върху обработката на грешки. По подразбиране се проверяват само кодовете на състояние 200–299.
Параметрите на заявката се кодират автоматично в зависимост от избрания тип: URL-encoding за GET заявки и JSON-encoding за POST. Alamofire също така поддържа Property List кодиране и персонализирани енкодери чрез протокола ParameterEncoder, което позволява адаптиране на формата към произволен сървър.
Сесията на Alamofire позволява конфигуриране на времеви ограничения, SSL сертификати, хедъри по подразбиране и прокси. Прихващачите EventMonitor дават възможност за проследяване на събития от жизнения цикъл на заявката: създаване, изпращане, получаване на отговор и завършване. Това е полезно за логване, аналитика и отстраняване на мрежови проблеми в продукционна среда.
Alamofire използва архитектура, базирана на Session, която капсулира инстанция на URLSession и мрежова конфигурация. Всяка заявка преминава през верига от обработващи програми: адаптери, политики за повторение, валидатори и сериализатори, което осигурява гъвкавост и разширяемост.
Обектът Session управлява всички мрежови заявки в приложението. Той се създава с конфигурация, съдържаща времеви ограничения, хедъри по подразбиране и сертификати. Всяко извикване на AF.request връща DataRequest, който може да бъде модифициран преди изпращане. Alamofire автоматично обработва Retain Cycle чрез слаби референции към сесията, предотвратявайки изтичане на памет.
import Alamofire
let session = Session(configuration: config)
session.request("https://api.example.com/users")
.validate()
.responseDecodable(of: [User].self) { response in
switch response.result {
case .success(let users):
print("Получени са \(users.count) потребители")
case .failure(let error):
print("Грешка: \(error.localizedDescription)")
}
}
Инсталирането на Alamofire се извършва чрез Swift Package Manager, CocoaPods или Carthage. Препоръчителният начин за нови проекти е SPM, вграден в Xcode, тъй като не изисква допълнителни инструменти и интеграцията се извършва с няколко кликвания.
Добавянето на пакета в Xcode става чрез менюто File → Add Packages. URL на хранилището: https://github.com/Alamofire/Alamofire. Препоръчва се версията да бъде фиксирана към последното стабилно издание. Alamofire поддържа семантично версиониране, а всички основни промени се документират в CHANGELOG.
CocoaPods остава популярен начин за проекти със съществуваща инфраструктура. Добавете реда pod 'Alamofire' във Podfile и изпълнете pod install. Alamofire няма външни зависимости, което опростява интеграцията и елиминира конфликти на версии в съществуващи проекти.
Примерите по-долу демонстрират типични сценарии за работа с Alamofire в iOS приложения: от прости GET заявки до качване на файлове с контрол на напредъка.
Проста GET заявка с параметри и декодиране на отговора в Codable модел — най-честият сценарий за използване на Alamofire в мобилни приложения. Параметрите се кодират автоматично, а отговорът се декодира чрез JSONDecoder. Кодът става компактен и четим.
struct User: Codable {
let id: Int
let name: String
let email: String
}
AF.request("https://jsonplaceholder.typicode.com/users",
method: .get)
.validate()
.responseDecodable(of: [User].self) { response in
switch response.result {
case .success(let users):
print("Потребители: \(users.count)")
case .failure(let error):
print("Грешка: \(error)")
}
}
POST заявка с JSON тяло се използва за създаване на ресурси на сървъра. Alamofire автоматично кодира подадения обект чрез JSONParameterEncoder, освобождавайки разработчика от ръчна сериализация. Отговорът се декодира в модел на данни чрез същия JSONDecoder.
let newUser = User(id: 1,
name: "Иван Петров",
email: "ivan@example.com")
AF.request("https://jsonplaceholder.typicode.com/users",
method: .post,
parameters: newUser,
encoder: JSONParameterEncoder.default)
.validate()
.responseDecodable(of: User.self) { response in
if let created = response.value {
print("Потребителят е създаден: \(created)")
}
}
Методът upload в Alamofire поддържа качване на файлове, данни и мултипарт форми. Библиотеката автоматично управлява напредъка и позволява проследяване на състоянието на качване чрез uploadProgress closures, което е удобно за показване на индикатор за напредък.
let imageData = UIImage(named: "photo")?.jpegData(compressionQuality: 0.8)
AF.upload(imageData,
to: "https://api.example.com/upload")
.uploadProgress { progress in
print("Напредък: \(progress.fractionCompleted * 100)%")
}
.responseDecodable(of: UploadResponse.self) { response in
print("Качването завърши")
}
Обработката на грешки в Alamofire се основава на комбинация от валидиране на отговори и Result типове. Моделът на грешки включва AFError, който покрива всички типични сценарии на мрежови повреди: времеви ограничения, липса на връзка, сървърни грешки и неуспешна сериализация. Всеки случай се обработва отделно.
За повторни опити след грешка Alamofire предоставя механизма RequestRetrier. Този протокол позволява дефиниране на политика за повторение: брой опити, закъснение между тях и условие, при което се извършва повторението. Например при грешка 503 на сървъра заявката може да се повтори след 2 секунди, а при 401 — да се поиска нов токен за удостоверяване.
Подходът AFError с изброяване гарантира, че разработчикът няма да пропусне нито един тип грешка — компилаторът проверява пълнотата на обработката. Това прави кода по-надежден и предвидим в сравнение с обработката на грешки чрез NSError в чист URLSession.
Протоколът RequestRetrier дефинира метода retry, който получава заявката, сесията, грешката и closure за завършване. В този метод разработчикът решава дали да повтори заявката и след колко време. Alamofire предоставя вградена имплементация на RetryPolicy за типични сценарии, но за продукционен код се препоръчва създаване на собствени политики, съобразени с бизнес логиката.
AFError е изброяване с вложени случаи за различни категории грешки. Разработчикът може да обработва всеки тип отделно: за времеви ограничения да предвиди повторение на заявката, за сървърни грешки — да покаже разбираемо съобщение на потребителя. Alamofire поддържа персонализирани политики за повторение чрез протокола RequestRetrier.
Вграденото валидиране проверява кодовете на състояние в диапазона 200–299 и типа на съдържанието на отговора. За разширено валидиране могат да се добавят персонализирани условия чрез validate closure, което позволява проверка на бизнес логиката на отговора преди предаване на данни към UI слоя.
Често задавани въпроси
Alamofire предоставя API на по-високо ниво в сравнение с URLSession. Библиотеката автоматизира кодирането на параметри, валидирането на отговори и сериализацията на данни, докато URLSession изисква ръчна конфигурация на всеки компонент на мрежовата заявка.
Да, Alamofire е напълно съвместим със SwiftUI. Заявките обикновено се изпълняват вътре в ObservableObject или чрез async/await с използване на Task. Alamofire не зависи от UIKit, така че работи отлично в съвременни SwiftUI приложения.
Основните алтернативи на Alamofire: вграденият URLSession, Moya (надстройка над Alamofire с абстракция на API), Networking от FreshOS и Apollo GraphQL за работа с GraphQL сървъри. Изборът зависи от архитектурата на проекта.
Alamofire има вградена интеграция с Combine чрез разширения с Publishers и поддържа Swift Concurrency чрез async/await. Това позволява избор на всеки модерен начин за асинхронна обработка на заявки.
Времевото ограничение се конфигурира чрез Session configuration. Задайте свойствата timeoutIntervalForRequest и timeoutIntervalForResource при създаване на URLSessionConfiguration, след което ги предайте на инициализатора на Session. Стойността по подразбиране е 60 секунди.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също