Requisições HTTP em Swift em 2025: do iniciante ao PRO em 20 minutos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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 self no 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