Introdução: por que requisições HTTP corretas são a base de qualquer aplicação
No desenvolvimento mobile e desktop moderno com Swift, raramente se encontra uma aplicação que funciona completamente offline. Praticamente qualquer aplicativo iOS ou macOS interage com servidores remotos: carrega dados, envia formulários, sincroniza conteúdo. O cliente HTTP é um componente chave, do qual dependem não apenas a velocidade, mas também a segurança e a estabilidade de toda a aplicação.
Neste artigo, vamos analisar como criar um cliente HTTP robusto em Swift usando o framework nativo Foundation. Você aprenderá como configurar corretamente o URLSession, tratar erros, trabalhar com JSON e usar abordagens modernas como async/await. O material será útil tanto para iniciantes que estão aprendendo Swift quanto para desenvolvedores experientes que desejam sistematizar seus conhecimentos.
1. Fundamentos do URLSession: a base da comunicação em rede
Em Swift, a principal ferramenta para trabalhar com HTTP é a classe URLSession. Ela faz parte do framework Foundation e fornece uma API flexível para enviar requisições e receber respostas. O URLSession suporta várias configurações, permitindo adaptar o comportamento para tarefas específicas.
Criação e configuração da sessão
O primeiro passo é criar uma instância de URLSession com uma configuração específica. Existem três tipos de configurações:
.default— configuração padrão com cache e armazenamento de cookies;.ephemeral— sem armazenamento de dados em disco (cookies, cache mantidos apenas na memória);.background— para tarefas em segundo plano que podem ser executadas mesmo após o fechamento do aplicativo.
Exemplo de criação de sessão com configuração personalizada:
let configuration = URLSessionConfiguration.defaultconfiguration.timeoutIntervalForRequest = 30configuration.waitsForConnectivity = true
let session = URLSession(configuration: configuration)Observe o parâmetro waitsForConnectivity: se definido como true, a requisição não falhará com erro na ausência de rede, mas aguardará a reconexão. Isso é especialmente importante para aplicativos móveis.
Requisição GET básica
A maneira mais simples de executar uma requisição é usar o método dataTask(with:). Aqui está um exemplo mínimo:
guard let url = URL(string: "https://api.example.com/users") else { return }
let task = session.dataTask(with: url) { data, response, error in if let error = error { print("Erro na requisição: \\(error.localizedDescription)") return } guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else { print("Resposta do servidor inválida") return } guard let data = data else { print("Nenhum dado na resposta") return } // Processamento dos dados print("Recebidos \\(data.count) bytes")}task.resume()Ponto importante: não se esqueça de chamar resume(), caso contrário a requisição não será iniciada. Este é um dos erros mais comuns de iniciantes.
2. Trabalhando com JSON: dos dados aos objetos
A maioria das APIs modernas retorna dados no formato JSON. Em Swift, para trabalhar com JSON, usa-se o protocolo Codable, que combina Encodable e Decodable. Isso permite converter facilmente dados em modelos e vice-versa.
Criação do modelo e decodificação
Suponha que o servidor retorne uma lista de usuários neste formato:
[ { "id": 1, "name": "Иван Петров", "email": "ivan@example.com" }]Vamos criar a estrutura correspondente:
struct User: Coda