Introdução: por que é importante saber trabalhar com HTTP em Swift
\nAplicativos móveis e desktop modernos raramente existem isoladamente. Praticamente qualquer aplicativo — desde um widget de clima até um aplicativo bancário — troca dados com o servidor. Para isso, utiliza-se o protocolo HTTP, e no lado Swift (iOS/macOS) a principal ferramenta é o framework Foundation e sua classe URLSession.
Neste artigo, vamos abordar como criar corretamente um cliente HTTP em Swift: desde uma simples requisição GET até o tratamento complexo de erros e trabalho com JSON. O material será útil tanto para iniciantes que estão conhecendo o desenvolvimento iOS quanto para desenvolvedores experientes que desejam sistematizar seus conhecimentos.
\nVamos explorar a abordagem moderna usando async/await (Swift 5.5+), que torna o código limpo e legível, além de abordar métodos clássicos com closures (completion handlers) para compatibilidade reversa.
Fundamentos do URLSession: criação e configuração
\nA classe URLSession é o principal "maestro" das requisições de rede em Swift. Ela gerencia conexões, cache e autenticação. Antes de fazer requisições, é necessário criar uma instância da sessão.
Tipos de sessões
\n- \n
- Compartilhada (singleton):
URLSession.shared— uma sessão simples sem customização. Adequada para requisições básicas. \n - Padrão:
URLSession(configuration: .default)— permite configurar timeouts, cache e cabeçalhos. \n - Effêmera:
URLSession(configuration: .ephemeral)— não salva cache e cookies no disco. Ideal para dados privados. \n - Background:
URLSession(configuration: .background(withIdentifier:))— para download/envio de dados em segundo plano, mesmo quando o aplicativo está minimizado. \n
import Foundation\n\n// Sessão simples\nlet sharedSession = URLSession.shared\n\n// Sessão customizada com timeout de 30 segundos\nlet config = URLSessionConfiguration.default\nconfig.timeoutIntervalForRequest = 30\nconfig.timeoutIntervalForResource = 60\nlet customSession = URLSession(configuration: config)\n\n\nCriação e envio de requisições HTTP
\nA requisição é formada usando a classe URLRequest. Ela contém a URL, o método HTTP, cabeçalhos e o corpo da requisição. Vamos abordar os métodos principais: GET e POST.
Requisição GET com async/await (abordagem moderna)
\nA partir do Swift 5.5, a Apple adicionou suporte para funções assíncronas (async/await). Esta é a forma mais concisa e segura de trabalhar com rede.
func fetchData(from urlString: String) async throws -> Data {\n guard let url = URL(string: urlString) else {\n throw URLError(.badURL)\n }\n \n var request = URLRequest(url: url)\n request.httpMethod = "GET"\n request.setValue("application/json", forHTTPHeaderField: "Accept")\n \n let (data, response) = try await URLSession.shared.data(for: request)\n \n // Verifica o status HTTP\n guard let httpResponse = response as? HTTPURLResponse,\n (200...299).contains(httpResponse.statusCode) else {\n throw URLError(.badServerResponse)\n }\n \n return data\n}\n\n// Uso:\nTask {\n do {\n let data = try await fetchData(from: "https://api.example.com/users")\n print("Recebidos \\(data.count) bytes")\n } catch {\n print("Erro: \\(error.localizedDescription)")\n }\n}\n\n\nRequisição POST com corpo JSON
\nPara enviar dados ao servidor, utiliza-se o método POST. O corpo da requisição geralmente é codificado em JSON.
\n\nstruct User: Codable {\n let name: String\n let email: String\n}\n\nfunc createUser(_ user: User) async throws -> Data {\n let url = URL(string: "https://api.example.com/users")!\n var request = URLRequest(url: url)\n request.httpMethod = "POST"\n request.setValue("application