Trabajo con API en Swift: REST, GraphQL, gRPC – ¿qué elegir en 2025?

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

API en Swift: de la teoría a las solicitudes reales

\n\n

Todo desarrollador iOS, tarde o temprano, se enfrenta a la necesidad de que la aplicación se comunique con el servidor. Ya sea cargar un feed de noticias, enviar datos de un formulario o hacer streaming en tiempo real, no se puede prescindir de una API (Application Programming Interface). Pero, ¿qué protocolo elegir? ¿El clásico REST, el flexible GraphQL o el ultrarrápido gRPC?

\n\n

En este artículo no solo enumeraremos los pros y los contras. Analizaremos el trabajo con API en Swift con ejemplos reales, mostraremos código y daremos consejos prácticos. Aprenderá cómo estructurar correctamente la capa de red, qué bibliotecas usar y cuándo cada enfoque se convierte en la mejor opción.

\n\n

Si programa en Swift y quiere que su aplicación se comunique con el backend de forma rápida, fiable y elegante, este artículo es para usted. ¡Vamos allá!

\n\n

REST API en Swift: un clásico que nunca pasa de moda

\n\n

REST (Representational State Transfer) es un estilo arquitectónico que utiliza métodos HTTP (GET, POST, PUT, DELETE) para trabajar con recursos. La mayoría de las API públicas (GitHub, Twitter, Stripe) están construidas sobre REST. Para un desarrollador Swift, esto significa trabajar con JSON, URLSession o Alamofire.

\n\n

Solicitud GET básica con URLSession

\n\n

Empecemos con lo más simple: obtener datos. Imaginemos que necesitamos cargar una lista de usuarios desde JSONPlaceholder:

\n\n
import Foundation\n\nstruct User: Codable {\n    let id: Int\n    let name: String\n    let email: String\n}\n\nfunc fetchUsers() async throws -> [User] {\n    let url = URL(string: "https://jsonplaceholder.typicode.com/users")!\n    let (data, response) = try await URLSession.shared.data(from: url)\n    \n    guard let httpResponse = response as? HTTPURLResponse,\n          (200...299).contains(httpResponse.statusCode) else {\n        throw URLError(.badServerResponse)\n    }\n    \n    return try JSONDecoder().decode([User].self, from: data)\n}\n\nTask {\n    do {\n        let users = try await fetchUsers()\n        print("Cargados \\(users.count) usuarios")\n    } catch {\n        print("Error: \\(error.localizedDescription)")\n    }\n}
\n\n

Observe el uso de async/await: es la forma moderna de trabajar con código asíncrono en Swift. El código se vuelve legible y conciso, sin closures ni callbacks.

\n\n

Solicitud POST con Alamofire

\n\n

Alamofire es la biblioteca más popular para el trabajo en red en Swift. Simplifica el manejo de errores, la codificación de parámetros y la carga de archivos. Aquí hay un ejemplo de envío de datos:

\n\n
import Alamofire\n\nstruct NewUser: Encodable {\n    let name: String\n    let email: String\n}\n\nAF.request("https://jsonplaceholder.typicode.com/users",\n           method: .post,\n           parameters: NewUser(name: "Iván", email: "ivan@example.com"),\n           encoder: JSONParameterEncoder.default)\n    .validate()\n    .responseDecodable(of: User.self) { response in\n        switch response.result {\n        case .success(let user):\n            print("Usuario creado con id: \\(user.id)")\n        case .failure(let error):\n            print("Error: \\(error.localizedDescription)")\n        }\n    }
\n\n

Consejo: Use .validate() — esto verificará automáticamente el código de estado y convertirá los errores HTTP en errores de Alamofire. Su código será más limpio y la depuración, más sencilla.

\n\n

¿Cuándo es REST la mejor opción?

\n
    \n
  • Tiene una aplicación CRUD simple (notas, lista de tareas).
  • \n
  • La API proporciona endpoints fijos.
  • \n
  • No necesita anidación compleja de datos.
  • \n
\n\n

GraphQL en Swift: flexibilidad en las consultas

\n\n

GraphQL es un lenguaje de consultas que permite al cliente solicitar exactamente los datos que necesita. Sin over-fetching (campos adicionales) ni under-fetching (necesidad de múltiples solicitudes). Para Swift existe una excelente biblioteca: Apollo iOS

Blogs

Book Recommendations