Cliente HTTP em Swift: fazendo requisições corretamente do A ao Z

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 é importante saber trabalhar com HTTP em Swift

\n

Aplicativos 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.

\n

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.

\n

Vamos 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.

\n\n

Fundamentos do URLSession: criação e configuração

\n

A 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.

\n\n

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
\n\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\n

Criação e envio de requisições HTTP

\n

A 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.

\n\n

Requisição GET com async/await (abordagem moderna)

\n

A 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.

\n\n
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\n

Requisição POST com corpo JSON

\n

Para enviar dados ao servidor, utiliza-se o método POST. O corpo da requisição geralmente é codificado em JSON.

\n\n
struct 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                

Blogs

Book Recommendations