Alamofire è un client HTTP per iOS, macOS, tvOS e watchOS, scritto in Swift. La libreria automatizza le attività di codifica dei parametri, validazione delle risposte e serializzazione dei dati. Secondo il repository GitHub di Alamofire, il progetto è utilizzato da oltre 40.000 applicazioni in tutto il mondo. Alamofire è considerato lo standard de facto per la comunicazione di rete nell'ecosistema Apple.
Punti chiave
Alamofire è una libreria per lavorare con richieste HTTP su piattaforme Apple, scritta interamente in Swift. Lo sviluppo iniziò nel 2014 come alternativa alla libreria AFNetworking in Objective-C e divenne rapidamente lo standard per la comunicazione di rete nella comunità iOS.
La libreria è costruita sopra il framework di sistema URLSession, astraendo la sua API di basso livello in concise catene di metodi. Alamofire supporta tutte le funzionalità di URLSession: sessioni in background, intercettatori di richieste, certificati SSL e molteplici metodi di serializzazione delle risposte.
Secondo Swift Package Index, Alamofire è tra i 10 pacchetti Swift più popolari con oltre 45.000 stelle su GitHub. La libreria è compatibile con iOS 10+, macOS 10.12+, tvOS 10+ e watchOS 3+.
Il principale vantaggio di Alamofire rispetto all'uso diretto di URLSession è la riduzione del codice boilerplate. Una singola chiamata AF.request sostituisce 15–20 righe di configurazione manuale di URLRequest, gestione della risposta e decodifica dei dati. Allo stesso tempo, la libreria mantiene la piena flessibilità per scenari personalizzati attraverso sessioni ed estensioni personalizzate.
Alamofire fornisce un'ampia gamma di funzioni di rete che coprono la maggior parte degli scenari di sviluppo mobile. Grazie all'architettura modulare, gli sviluppatori devono includere solo i componenti necessari.
I metodi HTTP GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS e TRACE sono implementati tramite un'API uniforme. Ogni metodo accetta parametri di richiesta, intestazioni e restituisce una risposta come tipo Result. Lo sviluppatore non deve configurare URLRequest manualmente — la libreria lo fa automaticamente in base agli argomenti forniti.
La validazione delle risposte in Alamofire permette di verificare i codici di stato e il contenuto della risposta prima di passare i dati all'applicazione. La libreria supporta condizioni di validazione personalizzate tramite closure, dando il controllo completo sulla gestione degli errori. Per impostazione predefinita, vengono controllati solo i codici di stato 200–299.
I parametri vengono automaticamente codificati in base al tipo selezionato: codifica URL per le richieste GET e codifica JSON per POST. Alamofire supporta anche la codifica Property List e codificatori personalizzati tramite il protocollo ParameterEncoder, consentendo di adattare il formato a qualsiasi server.
La sessione in Alamofire permette di configurare timeout, certificati SSL, intestazioni HTTP predefinite e proxy. Gli intercettatori EventMonitor consentono di tracciare gli eventi del ciclo di vita della richiesta: creazione, invio, ricezione della risposta e completamento. Ciò è utile per la registrazione, l'analisi e il debug dei problemi di rete in produzione.
Alamofire utilizza un'architettura basata su Session che incapsula un'istanza di URLSession e la configurazione di rete. Ogni richiesta passa attraverso una catena di gestori: adattatori, politiche di ripetizione, validatori e serializzatori, garantendo flessibilità ed estensibilità.
L'oggetto Session gestisce tutte le richieste di rete nell'applicazione. Viene creato con una configurazione contenente timeout, intestazioni predefinite e certificati. Ogni chiamata AF.request restituisce un DataRequest che può essere modificato prima dell'invio. Alamofire gestisce automaticamente i cicli di mantenimento tramite riferimenti deboli alla sessione, prevenendo perdite di memoria.
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("Ricevuti \(users.count) utenti")
case .failure(let error):
print("Errore: \(error.localizedDescription)")
}
}
L'installazione di Alamofire viene eseguita tramite Swift Package Manager, CocoaPods o Carthage. Il metodo consigliato per i nuovi progetti è SPM, integrato in Xcode, poiché non richiede strumenti aggiuntivi e l'integrazione avviene in pochi clic.
L'aggiunta del pacchetto in Xcode viene eseguita tramite il menu File → Add Packages. URL del repository: https://github.com/Alamofire/Alamofire. Si consiglia di fissare la versione all'ultima versione stabile. Alamofire segue il versionamento semantico e tutte le modifiche sostanziali sono documentate nel CHANGELOG.
CocoaPods rimane un'opzione popolare per progetti con infrastruttura esistente. Aggiungi la riga pod 'Alamofire' al tuo Podfile ed esegui pod install. Alamofire non ha dipendenze esterne, semplificando l'integrazione ed eliminando i conflitti di versione nei progetti esistenti.
Gli esempi seguenti mostrano scenari tipici di utilizzo di Alamofire nelle applicazioni iOS: dalle semplici richieste GET al caricamento di file con monitoraggio del progresso.
Una semplice richiesta GET con parametri e decodifica della risposta in un modello Codable è lo scenario di utilizzo più comune di Alamofire nelle applicazioni mobili. I parametri vengono automaticamente codificati e la risposta viene decodificata tramite JSONDecoder. Il codice è compatto e leggibile.
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("Utenti: \(users.count)")
case .failure(let error):
print("Errore: \(error)")
}
}
Una richiesta POST con corpo JSON viene utilizzata per creare risorse sul server. Alamofire codifica automaticamente l'oggetto passato tramite JSONParameterEncoder, risparmiando allo sviluppatore la serializzazione manuale. La risposta viene decodificata in un modello dati utilizzando lo stesso JSONDecoder.
let newUser = User(id: 1,
name: "Mario Rossi",
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("Utente creato: \(created)")
}
}
Il metodo upload in Alamofire supporta il caricamento di file, dati e moduli multipart. La libreria gestisce automaticamente il progresso e permette di monitorare lo stato del caricamento tramite closure uploadProgress, comodo per visualizzare un indicatore di avanzamento.
let imageData = UIImage(named: "photo")?.jpegData(compressionQuality: 0.8)
AF.upload(imageData,
to: "https://api.example.com/upload")
.uploadProgress { progress in
print("Avanzamento: \(progress.fractionCompleted * 100)%")
}
.responseDecodable(of: UploadResponse.self) { response in
print("Caricamento completato")
}
La gestione degli errori in Alamofire si basa su una combinazione di validazione delle risposte e tipi Result. Il modello di errore include AFError, che copre tutti gli scenari tipici di guasto di rete: timeout, perdita di connessione, errori del server e serializzazione fallita. Ogni caso viene gestito separatamente.
Per i tentativi dopo un errore, Alamofire fornisce il meccanismo RequestRetrier. Questo protocollo definisce la politica di ripetizione: numero di tentativi, ritardo tra di essi e la condizione in cui viene eseguito un tentativo. Ad esempio, in caso di errore 503 del server, la richiesta può essere ripetuta dopo 2 secondi, mentre in caso di errore 401, può essere richiesto un nuovo token di autenticazione.
L'approccio con enumerazione AFError garantisce che lo sviluppatore non perda alcun tipo di errore — il compilatore verifica la completezza della gestione. Ciò rende il codice più affidabile e prevedibile rispetto alla gestione degli errori tramite NSError in URLSession puro.
Il protocollo RequestRetrier definisce un metodo di ripetizione che riceve la richiesta, la sessione, l'errore e la closure di completamento. In questo metodo, lo sviluppatore decide se ripetere la richiesta e dopo quanto ritardo. Alamofire fornisce un'implementazione integrata RetryPolicy per scenari comuni, ma per il codice di produzione si consiglia di creare politiche personalizzate basate sulla logica di business.
AFError è un'enumerazione con casi annidati per diverse categorie di errori. Lo sviluppatore può gestire ogni tipo separatamente: per i timeout — ripetere la richiesta, per gli errori del server — mostrare un messaggio comprensibile all'utente. Alamofire supporta politiche di ripetizione personalizzate tramite il protocollo RequestRetrier.
La validazione integrata verifica i codici di stato nell'intervallo 200–299 e il tipo di contenuto della risposta. Per una validazione estesa, è possibile aggiungere condizioni personalizzate tramite la closure validate, consentendo di verificare la logica di business prima di passare i dati al livello UI.
Domande frequenti
Alamofire fornisce un'API di livello superiore rispetto a URLSession. La libreria automatizza la codifica dei parametri, la validazione delle risposte e la serializzazione dei dati, mentre URLSession richiede la configurazione manuale di ogni componente della richiesta di rete.
Sì, Alamofire è completamente compatibile con SwiftUI. Le richieste vengono generalmente eseguite all'interno di ObservableObject o tramite async/await usando Task. Alamofire non dipende da UIKit, quindi funziona perfettamente nelle moderne applicazioni SwiftUI.
Le principali alternative ad Alamofire sono: URLSession integrato, Moya (un wrapper su Alamofire con astrazione API), Networking di FreshOS e Apollo GraphQL per lavorare con server GraphQL. La scelta dipende dall'architettura del progetto.
Alamofire ha un'integrazione integrata con Combine tramite estensioni Publishers e supporta Swift Concurrency tramite async/await. Ciò consente di scegliere qualsiasi metodo moderno di elaborazione asincrona.
Il timeout viene configurato tramite la configurazione di Session. Imposta le proprietà timeoutIntervalForRequest e timeoutIntervalForResource durante la creazione di URLSessionConfiguration, quindi passale all'inizializzatore di Session. Il valore predefinito è 60 secondi.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche