Introdução: Por que desenvolvedores Swift ainda pesquisam requisições HTTP?
Se você já escreveu um aplicativo em Swift que se comunica com um servidor, certamente já se deparou com essa questão. Parece simples, não? Enviou uma requisição, recebeu uma resposta. Mas na prática, um em cada dois desenvolvedores (mesmo com experiência) abre o Stack Overflow e pesquisa: "How to make HTTP request in Swift?". E isso é normal.
Por quê? Porque o ecossistema Swift muda. Ontem ainda escrevíamos closures e delegates. Hoje — async/await. E amanhã, talvez surja algo novo. Em 2025, as abordagens para requisições de rede se consolidaram, mas o diabo, como sempre, está nos detalhes: gerenciamento de threads, tratamento de erros, cancelamento de requisições, testes.
Neste artigo, vamos abordar as melhores práticas reais para executar requisições HTTP em Swift — desde o básico URLSession até técnicas avançadas com async/await e bibliotecas. Você aprenderá a escrever código de rede limpo, seguro e eficiente. Vamos lá!
1. URLSession: O fundamento que todos precisam conhecer
Vamos começar pelo principal. Na biblioteca padrão do Swift (Foundation), há tudo o que você precisa para trabalhar com HTTP — a classe URLSession. Lembre-se: para 90% das tarefas, você não precisa de bibliotecas de terceiros. URLSession é uma ferramenta poderosa, flexível e nativa.
1.1. Requisição GET simples (estilo antigo)
Vamos relembrar como isso era feito antes. Este código ainda pode ser encontrado em projetos legados:
let url = URL(string: "https://api.pythonlib.ru/users")!let task = URLSession.shared.dataTask(with: url) { data, response, error in if let error = error { print("Erro: \\(error.localizedDescription)") return } guard let data = data else { print("Sem dados") return } // Trabalhar com data print("Bytes recebidos: \\(data.count)")}task.resume()Este código funciona. Mas tem desvantagens:
- Callback hell — se precisar fazer uma cadeia de requisições, o código se torna ilegível.
- Vazamentos de memória — é fácil esquecer o
weak selfno closure. - Difícil de cancelar — é necessário manter uma referência ao
task.
Em 2025, escrevemos de forma diferente.
1.2. Requisição GET moderna com async/await
A partir do Swift 5.5 (iOS 15, macOS 12), temos structured concurrency. Isso muda tudo:
func fetchUsers() async throws -> [User] { let url = URL(string: "https://api.pythonlib.ru/users")! 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)}Bonito, não? Sem closures, sem resume(). O código é lido como síncrono, mas executado de forma assíncrona. Este é o padrão de facto em 2025.
2. Requisição POST: enviando dados para o servidor
Agora vamos enviar dados. Suponha que precisamos criar um novo usuário.
2.1. POST com corpo JSON
func createUser(name: String, email: String) async throws -> User { let url = URL(string: "https://api.pythonlib.ru/users")! var request = URLRequest(url: url) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") let body = ["name": name, "email": email] request.httpBody = try JSONSerialization.data(withJSONObject: body) let (data, response) = try await URLSession.shared.data(for: request) // Processamento da resposta... return try JSONDecoder().decode(User.self, from: data)}
Blogs
Book Recommendations
Leia também
Arrays e Coleções em Java: guia completo para iniciantes — parte 1
Trabalhando com o sistema de arquivos em Swift: Guia completo
Princípios SOLID em Swift: teoria e prática para iOS/macOS
Versões do C#: o que está por trás dos números e como funciona
Criando um bot do Telegram em Rust: guia passo a passo para os corajosos