Alamofire é uma biblioteca HTTP popular para iOS e macOS, escrita em Swift e construída sobre URLSession. Ela fornece uma sintaxe declarativa para requisições de rede, manipulação de JSON, upload de arquivos e gerenciamento de autenticação. De acordo com o repositório do Alamofire no GitHub (2025), o Alamofire tem mais de 42.000 estrelas e é usado por milhares de projetos iOS em todo o mundo.
Pontos principais
Alamofire é um cliente HTTP para Swift criado pela Alamofire Software Foundation (originalmente por Mattt Thompson em 2014). A biblioteca abstrai detalhes de baixo nível do URLSession, fornecendo uma API limpa e expressiva para comunicação em rede.
A filosofia central do Alamofire é a sintaxe de encadeamento, onde os parâmetros da requisição (URL, método, cabeçalhos, parâmetros, codificador) são passados através de chamadas sequenciais. Isso torna o código mais legível e reduz a probabilidade de erros relacionados à configuração incorreta do URLRequest. A abordagem declarativa permite focar no que precisa ser feito, em vez dos detalhes de como configurar a conexão. O desenvolvedor descreve o resultado desejado e a biblioteca cuida do trabalho de rede de baixo nível.
A biblioteca é mantida ativamente desde 2014 e passou por sete versões principais. O Alamofire 5, atual em 2025–2026, inclui suporte para Combine, async/await, conversores de resposta, EventMonitor para depuração e RequestInterceptor para interceptar requisições. Cada versão principal trouxe melhorias significativas: o Alamofire 4 adicionou suporte a Codable, o Alamofire 5 adicionou Combine Publishers e um sistema de interceptação de requisições aprimorado.
O ecossistema do Alamofire inclui bibliotecas adicionais: AlamofireImage para carregamento e cache de imagens, AlamofireNetworkActivityIndicator para o indicador de rede na barra de status do iOS e AlamofireObjectMapper para integração com ObjectMapper. Esses componentes fazem do Alamofire uma pilha de rede completa, não apenas um cliente HTTP.
O Alamofire é instalado via Swift Package Manager (recomendado), CocoaPods ou Carthage. No Xcode, basta abrir o menu File → Add Packages, colar o URL do repositório e especificar a versão.
// Swift Package Manager — adicionar ao Package.swift
dependencies: [
.package(url: "https://github.com/Alamofire/Alamofire.git",
from: "5.9.0")
]
// Importar no arquivo
import Alamofire
Após a instalação, o Alamofire fica disponível globalmente através do namespace AF(abreviação de Alamofire) sem configuração adicional. A maioria dos projetos começa configurando uma Session com sua própria configuração — isso permite definir um URL base, cabeçalhos padrão, timeouts e manipuladores de certificados TLS.
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 30
let session = Session(configuration: configuration)
Criar uma sessão personalizada através de Session(configuration:) é necessário quando uma configuração única é necessária para diferentes partes da aplicação — por exemplo, uma sessão separada para downloads de imagens com cache agressivo e outra para requisições de API com autenticação. A Session do Alamofire aceita não apenas configuração, mas também um interceptor, serverTrustManager, cachedResponseHandler e redirectHandler, fornecendo controle total sobre o comportamento da rede em todos os estágios da requisição.
O Alamofire fornece uma ampla gama de funções que cobrem a maioria dos cenários de interação de rede em aplicações iOS. Vamos ver as principais.
A sintaxe básica de uma requisição inclui o método, URL, parâmetros e codificação. Todos os métodos HTTP padrão são suportados através do enum HTTPMethod: get, post, put, patch, delete. Os parâmetros podem ser codificados como parâmetros de URL (URLEncoding), corpo JSON (JSONEncoding) ou dados multiparte (MultipartFormData).
AF.request("https://api.example.com/users", method: .post,
parameters: ["name": "Alex", "role": "developer"])
.validate()
.responseDecodable(of: User.self) { response in
switch response.result {
case .success(let user):
print("Criado pelo usuário: \(user)")
case .failure(let error):
print("Erro: \(error)")
}
}
O método validate() verifica automaticamente o código de status (200–299) e o tipo de conteúdo, retornando um erro em caso de resposta inesperada, eliminando a verificação manual de statusCode. O responseDecodable usa o protocolo Decodable para desserialização automática de JSON em estruturas Swift — isso elimina o JSONSerialization manual e reduz o código boilerplate ao trabalhar com APIs REST.
O Alamofire suporta vários tipos de manipuladores de resposta: response (dados brutos), responseJSON (dicionário/array), responseString (texto), responseData (Data) e responseDecodable (modelo Decodable). Os conversores de resposta podem ser personalizados — para protobuf, formatos gráficos ou protocolos próprios.
Para enviar dados ao servidor, usa-se upload, que suporta Data, File e MultipartFormData. O download de arquivos grandes é feito através de download com a capacidade de retomar via resumeData após interrupção da conexão. Ambas as operações suportam rastreamento de progresso através de uploadProgress e downloadProgress com valores fracionários de 0 a 1 para exibição na interface do usuário.
O upload multiparte com Alamofire é particularmente conveniente: o método upload(multipartFormData:) aceita um closure onde as partes do formulário são adicionadas via append. Cada parte pode conter dados, um arquivo ou um fluxo, bem como seu próprio nome e tipo mime. O Alamofire calcula automaticamente os limites multiparte e define o cabeçalho Content-Type correto, poupando o desenvolvedor de formar manualmente o corpo da requisição. Para arquivos grandes, recomenda-se usar provedores de fluxo em vez de carregar o arquivo inteiro na memória — isso evita exceder o limite de memória em dispositivos móveis com recursos limitados. Um cenário típico é enviar o avatar do usuário junto com os dados do perfil em uma única requisição multiparte, reduzindo o número de chamadas HTTP e simplificando o processamento no servidor.
Comparar o Alamofire com o URLSession nativo ajuda a tomar decisões arquiteturais. O Alamofire não substitui o URLSession — ele é construído sobre ele e usa os mesmos mecanismos de configuração, cache e tarefas em segundo plano. Todos os recursos do URLSession são acessíveis através do Alamofire, mas com uma sintaxe declarativa mais conveniente.
| Critério | Alamofire | URLSession |
|---|---|---|
| Sintaxe | Declarativa, encadeada | Imperativa, closures |
| Decodificação JSON | Automática (responseDecodable) | Manual (JSONSerialization/JSONDecoder) |
| Validação | validate() — embutida | Verificação manual de statusCode |
| Progresso | uploadProgress, downloadProgress | Através de URLSessionTaskDelegate |
| Interceptadores | RequestInterceptor, EventMonitor | Delegados, subclasses |
| Dependências | Requer instalação (SPM, CocoaPods) | Nenhuma, embutido no Foundation |
Em projetos grandes, o Alamofire reduz o código de requisições de rede em 30–50% e simplifica o tratamento de erros. Em projetos pequenos ou quando o tamanho do binário é uma restrição rigorosa, o URLSession nativo é preferível devido à ausência de dependências externas.
O Alamofire 5 moderno se integra com Combine através da propriedade publishDecodable, que retorna um Publisher, permitindo cadeias de requisições reativas com tratamento de erros e transformação de dados. Para async/await, os métodos com o sufixo value estão disponíveis — por exemplo, AF.request(url).serializingDecodable(User.self).value, tornando a sintaxe extremamente concisa e reminiscente do trabalho com URLSession nativo. Ao usar async/await, os closures não são mais necessários e o tratamento de erros é feito através de blocos do-catch padrão do Swift, simplificando a manutenção e legibilidade do código a longo prazo.
Vamos ver um exemplo mais complexo — uma requisição com um interceptador que adiciona automaticamente um token de autorização e realiza uma nova tentativa em caso de erro 401. Este é um cenário típico para aplicações com autenticação JWT.
class AuthInterceptor: RequestInterceptor {
func adapt(_ urlRequest: URLRequest,
for session: Session,
completion: @escaping (Result<URLRequest, Error>) -> Void) {
var request = urlRequest
request.setValue("Bearer \(TokenManager.shared.token)",
forHTTPHeaderField: "Authorization")
completion(.success(request))
}
func retry(_ request: Request,
for session: Session,
dueTo error: Error,
completion: @escaping (RetryResult) -> Void) {
guard let response = request.response,
response.statusCode == 401
else { return completion(.doNotRetry) }
TokenManager.shared.refreshToken { success in
completion(success ? .retry : .doNotRetry)
}
}
}
O AuthInterceptor implementa dois protocolos: adapt (adiciona um token a cada requisição) e retry (tenta renovar o token em caso de erro 401). O método retry verifica o código de status da resposta e, se um 401 for recebido, solicita um novo token através do TokenManager. Após uma renovação bem-sucedida, a requisição é repetida automaticamente.
Usando o interceptador com uma sessão:
let session = Session(interceptor: AuthInterceptor())
session.request("https://api.example.com/profile")
.responseDecodable(of: Profile.self) { response in
print(response.result)
}
Todas as requisições através desta sessão passam automaticamente pelo AuthInterceptor — o token é adicionado aos cabeçalhos e, em caso de 401, uma renovação e repetição são realizadas. Isso elimina a duplicação de código de autenticação em cada requisição e centraliza a lógica de gerenciamento de tokens.
Perguntas frequentes
Alamofire é uma camada sobre URLSession com sintaxe declarativa, validação embutida, decodificação JSON automática e interceptadores. URLSession é a API nativa da Apple sem dependências, mas requer mais código para as mesmas tarefas. Alamofire reduz o volume de código de rede em 30–50%.
O método recomendado é o Swift Package Manager: no Xcode, selecione File → Add Packages, insira o URL https://github.com/Alamofire/Alamofire.git e especifique a versão 5.9.0 ou posterior. Alternativamente, via CocoaPods: pod 'Alamofire', '~> 5.9'.
Sim, a partir do Alamofire 5.5 foi adicionado suporte a async/await. Os métodos request, upload e download podem ser usados com a sintaxe await. Alternativamente, o Alamofire se integra com Combine publicando valores através de um Publisher.
O Alamofire fornece os métodos uploadProgress e downloadProgress, que aceitam um closure com um objeto Progress. O progresso retorna fractionCompleted, completedUnitCount e totalUnitCount, o que é conveniente para exibição na interface através de uma barra de progresso.
Sim, o Alamofire suporta sessões em segundo plano através do URLSessionConfiguration.background padrão. Você precisa criar uma Session com a configuração apropriada e registrar um manipulador de conclusão no AppDelegate. O DownloadRequest continuará funcionando mesmo após minimizar o aplicativo.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também