Introducción: por qué las solicitudes HTTP correctas son la base de cualquier aplicación
En el desarrollo moderno de aplicaciones móviles y de escritorio con Swift, rara vez nos encontramos con una aplicación que funcione completamente de forma autónoma. Prácticamente cualquier aplicación de iOS o macOS interactúa con servidores remotos: carga datos, envía formularios, sincroniza contenido. El cliente HTTP es un componente clave, del cual dependen no solo la velocidad de trabajo, sino también la seguridad y la estabilidad de toda la aplicación.
En este artículo, analizaremos cómo crear un cliente HTTP robusto en Swift utilizando el framework integrado Foundation. Aprenderá cómo configurar correctamente URLSession, manejar errores, trabajar con JSON y usar enfoques modernos como async/await. El material será útil tanto para principiantes que recién están aprendiendo Swift, como para desarrolladores experimentados que deseen sistematizar sus conocimientos.
1. Fundamentos de URLSession: la base de la interacción en red
En Swift, la herramienta principal para trabajar con HTTP es la clase URLSession. Forma parte del framework Foundation y proporciona una API flexible para enviar solicitudes y recibir respuestas. URLSession soporta varias configuraciones, lo que permite adaptar el comportamiento a tareas específicas.
Creación y configuración de la sesión
El primer paso es crear una instancia de URLSession con una configuración determinada. Existen tres tipos de configuraciones:
.default— configuración estándar con almacenamiento en caché y conservación de cookies;.ephemeral— sin guardar datos en disco (las cookies y la caché se almacenan solo en memoria);.background— para tareas en segundo plano que pueden ejecutarse incluso después de cerrar la aplicación.
Ejemplo de creación de una sesión con configuración personalizada:
let configuration = URLSessionConfiguration.defaultconfiguration.timeoutIntervalForRequest = 30configuration.waitsForConnectivity = true
let session = URLSession(configuration: configuration)Preste atención al parámetro waitsForConnectivity: si se establece en true, la solicitud no fallará con un error cuando no haya red, sino que esperará a que se restablezca la conexión. Esto es especialmente importante para aplicaciones móviles.
Solicitud GET básica
La forma más sencilla de ejecutar una solicitud es usar el método dataTask(with:). Aquí hay un ejemplo 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("Error de solicitud: \\(error.localizedDescription)") return } guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else { print("Respuesta del servidor incorrecta") return } guard let data = data else { print("No hay datos en la respuesta") return } // Procesamiento de datos print("Recibidos \\(data.count) bytes")}task.resume()Un punto importante: no olvide llamar a resume(), de lo contrario la solicitud no comenzará. Este es uno de los errores más comunes entre los principiantes.
2. Trabajo con JSON: de los datos a los objetos
La mayoría de las API modernas devuelven datos en formato JSON. En Swift, para trabajar con JSON se utiliza el protocolo Codable, que combina Encodable y Decodable. Esto permite convertir fácilmente datos en modelos y viceversa.
Creación del modelo y decodificación
Supongamos que el servidor devuelve una lista de usuarios en este formato:
[ { "id": 1, "name": "Iván Petrov", "email": "ivan@example.com" }]Creemos la estructura correspondiente:
struct User: Coda