Introducción: ¿Por qué Swift para REST API?
Swift no es solo un lenguaje para aplicaciones móviles. Gracias a frameworks como Vapor y Kitura, puedes crear REST API completos para el lado del servidor. Esto es especialmente útil si tu aplicación iOS ya usa Swift: puedes escribir tanto el cliente como el servidor en el mismo lenguaje, reduciendo el tiempo de desarrollo y simplificando el mantenimiento del código.
En este artículo crearemos un REST API simple en Swift usando el framework Vapor — la solución más popular para desarrollo backend en Swift. Configuraremos el servidor, añadiremos rutas para operaciones CRUD y lo probaremos. Todo el proceso tomará no más de 30 minutos.
Requisitos: macOS o Linux, tener instalado Swift 5.8+ (o superior), comprensión básica de HTTP y JSON.
Paso 1: Instalación y configuración del proyecto Vapor
Vapor proporciona una herramienta CLI conveniente para un inicio rápido. Instálala a través de Homebrew:
brew install vaporLuego crea un nuevo proyecto:
vapor new MyAPI --template=apicd MyAPILa bandera --template=api crea un esqueleto con la estructura mínima para un REST API. Después de crear el proyecto, ábrelo en Xcode (o cualquier editor):
open Package.swiftLa estructura del proyecto incluye:
Sources/App/— la lógica principal (rutas, controladores, modelos).Sources/App/routes.swift— registro de rutas.Sources/App/configure.swift— configuración de la aplicación.Package.swift— dependencias (Vapor ya está incluido).
Si usas Xcode, descargará las dependencias automáticamente. En la terminal ejecuta vapor build para compilar.
Paso 2: Creación del modelo de datos y la base de datos
Para el REST API necesitamos un modelo. Crearemos un modelo simple Task (tarea) con los campos: id, title, completed. En Vapor, los modelos normalmente heredan de Model (Fluent ORM).
Crea el archivo Sources/App/Models/Task.swift:
import Fluentimport Vapor
final class Task: Model, Content { static let schema = "tasks"
@ID(key: .id) var id: UUID?
@Field(key: "title") var title: String
@Field(key: "completed") var completed: Bool
init() {}
init(id: UUID? = nil, title: String, completed: Bool = false) { self.id = id self.title = title self.completed = completed }}Ahora crearemos una migración para la tabla en la base de datos. Crea el archivo Sources/App/Migrations/CreateTask.swift:
import Fluent
struct CreateTask: Migration { func prepare(on database: Database) -> EventLoopFuture<Void> { database.schema("tasks") .id() .field("title", .string, .required) .field("completed", .bool, .required) .create() }
func revert(on database: Database) -> EventLoopFuture<Void> { database.schema("tasks").delete() }}Añade la migración en configure.swift:
app.migrations.add(CreateTask())Por defecto, Vapor usa SQLite (un archivo en la carpeta del proyecto). Si quieres PostgreSQL o MySQL, cambia la configuración en configure.swift, pero para un inicio rápido SQLite es perfecto.
Paso 3: Registro de rutas del REST API
Ahora crearemos un controlador para manejar las solicitudes. Crea el archivo Sources/App/Controllers/TaskController.swift:
import Vaporimport Fluent
struct TaskController: RouteCollection { func boot(routes: RoutesBuilder) throws { let tasks = routes.grouped("tasks")
tasks.get(use: index) // GET /tasks tasks.post(use: create) // POST /tasks tasks.grou