Cliente HTTP para Swift (iOS/macOS): top bibliotecas para requisições de rede
Trabalhar com rede é uma parte essencial do desenvolvimento para iOS e macOS. Seja para carregar dados de uma REST API, enviar arquivos ou trabalhar com WebSocket, a escolha do cliente HTTP certo impacta diretamente a performance, legibilidade do código e tempo de desenvolvimento. Neste artigo, vamos analisar as 4 principais bibliotecas para Swift que ajudarão você a trabalhar eficientemente com HTTP.
1. URLSession — padrão nativo da Apple
URLSession é o framework fundamental da Apple para trabalhar com requisições de rede. Ele está embutido em todo aplicativo iOS/macOS e não requer instalação de dependências adicionais. Suporta HTTP/2, downloads em segundo plano, autenticação e cache.
Vantagens:
- Não requer dependências externas
- Integração completa com GCD e Combine (async/await)
- Alta performance devido à implementação nativa
- Suporte a sessões em segundo plano para download de arquivos
Desvantagens:
- Muito código boilerplate para cenários complexos
- Falta de uma API conveniente para serialização/desserialização
Exemplo de uso (Swift 5.5+ com async/await):
import Foundation
struct User: Codable { let id: Int let name: String let email: String}
func fetchUser(id: Int) async throws -> User { let url = URL(string: "https://jsonplaceholder.typicode.com/users/\\(id)")! let (data, response) = try await URLSession.shared.data(from: url) guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else { throw URLError(.badServerResponse) } return try JSONDecoder().decode(User.self, from: data)}
// UsoTask { do { let user = try await fetchUser(id: 1) print("User: \\(user.name), email: \\(user.email)") } catch { print("Error: \\(error.localizedDescription)") }}2. Alamofire — o cliente HTTP mais popular para Swift
Alamofire é um wrapper elegante sobre URLSession que simplifica significativamente as requisições de rede. A biblioteca oferece uma API encadeada, serialização automática de JSON, tratamento de erros, upload/download de arquivos e suporte a Combine.
Vantagens:
- Código boilerplate mínimo
- Tratamento de erros integrado e tentativas repetidas
- Suporte a Codable, Combine e async/await
- Configuração flexível de cabeçalhos, parâmetros e timeouts
Desvantagens:
- Dependência adicional (~1-2 MB)
- Pode ser excessivo para projetos simples
Exemplo de uso:
import Alamofire
struct Post: Codable { let userId: Int let id: Int let title: String let body: String}
// Requisição GET com async/awaitfunc fetchPosts() async throws -> [Post] { let response = await AF.request("https://jsonplaceholder.typicode.com/posts") .serializingDecodable([Post].self) .response switch response.result { case .success(let posts): return posts case .failure(let error): throw error }}
// Requisição POST com parâmetrosfunc createPost(title: String, body: String) async throws -> Post { let parameters: Parameters = [ "userId": 1, "title": title, "body": body ] let response = await AF.request("https://jsonplaceholder.typicode.com/posts", method: .post, parameters: parameters, encoding: JSONEncoding.default) .serializingDecodable(Post.self) .response switch response.result { case .s