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-у омогућава проверу кодова статуса и садржаја одговора пре преноса података у апликацију. Библиотека подржава прилагођене услове валидације кроз затварања, што даје потпуну контролу над обрадом грешака. Подразумевано се проверавају само статусни кодови 200–299.
Параметри захтева се аутоматски кодирају у зависности од изабраног типа: URL-encoding за GET захтеве и JSON-encoding за POST. Alamofire такође подржава Property List кодирање и прилагођене кодираче кроз протокол ParameterEncoder, што омогућава прилагођавање формата било ком серверу.
Сесија Alamofire-а омогућава подешавање временских ограничења, SSL сертификата, подразумеваних HTTP заглавља и проксија. Пресретачи 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 подржава семантичко верзионисање, а све breaking измене су документоване у 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 затварања, што је згодно за приказ индикатора напретка.
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 који прима захтев, сесију, грешку и затварање завршетка. У овом методу програмер одлучује да ли да понови захтев и након ког времена. Alamofire обезбеђује уграђену имплементацију RetryPolicy за типичне сценарије, али се за продукцијски код препоручује креирање сопствених политика са уважавањем пословне логике.
AFError је набрајање са угнежђеним случајевима за различите категорије грешака. Програмер може обрађивати сваки тип засебно: за временска ограничења предвидети понављање захтева, за грешке сервера — приказати разумљиву поруку кориснику. Alamofire подржава прилагођене политике понављања кроз протокол RequestRetrier.
Уграђена валидација проверава кодове статуса у опсегу 200–299 и тип садржаја одговора. За проширену валидацију могу се додати прилагођени услови кроз validate затварање, што омогућава проверу пословне логике одговора пре преноса података у 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-ом кроз проширења са Publisher-има и подржава Swift Concurrency кроз async/await. Ово омогућава избор било ког савременог начина асинхроне обраде захтева.
Временско ограничење се подешава кроз Session configuration. Подесите својства timeoutIntervalForRequest и timeoutIntervalForResource приликом креирања URLSessionConfiguration, затим их проследите иницијализатору Session-а. Подразумевана вредност је 60 секунди.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође