Cómo escribir una API REST en Swift en 30 minutos: para principiantes
Swift no es solo un lenguaje para crear aplicaciones móviles para iOS y macOS. Con la llegada del framework Vapor, el desarrollo de aplicaciones de servidor en Swift se ha vuelto accesible y conveniente. En este artículo, mostraremos cómo escribir una API REST simple en Swift en solo 30 minutos. Aprenderá los principios básicos de trabajar con Vapor, creará rutas, manejará solicitudes y devolverá respuestas JSON.
Esta guía es perfecta para principiantes que ya conocen los fundamentos de Swift pero nunca han escrito código de servidor. Analizaremos el proceso paso a paso, con ejemplos de código y explicaciones.
¿Qué es una API REST y para qué sirve?
REST (Transferencia de Estado Representacional) es un estilo arquitectónico para la interacción de componentes de una aplicación distribuida en la red. Una API REST permite que las aplicaciones cliente (por ejemplo, una aplicación iOS) reciban y envíen datos al servidor a través de solicitudes HTTP.
Los métodos HTTP principales utilizados en REST son:
- GET — obtener datos
- POST — crear un nuevo recurso
- PUT — actualizar un recurso existente
- DELETE — eliminar un recurso
Para nuestro ejemplo, crearemos una API simple para gestionar una lista de tareas (Todo List). Será compatible con las cuatro operaciones CRUD básicas (Crear, Leer, Actualizar, Eliminar).
Instalación de Vapor y creación del proyecto
Vapor es el framework web más popular para Swift. Para empezar, instale Vapor Toolbox a través de Homebrew:
brew install vaporDespués de la instalación, cree un nuevo proyecto:
vapor new TodoAPIcd TodoAPIEste comando creará la estructura del proyecto con un servidor ya configurado. Abra el proyecto en Xcode:
open Package.swiftEn Xcode, verá la estructura estándar de un proyecto Vapor. El código principal se encuentra en la carpeta Sources/App.
Creación del modelo de datos
Para trabajar con tareas, necesitamos un modelo. Crearemos un archivo Todo.swift en la carpeta Sources/App/Models:
import Vaporimport Fluent
final class Todo: Model, Content { static let schema = "todos" @ID(key: .id) var id: UUID? @Field(key: "title") var title: String @Field(key: "is_completed") var isCompleted: Bool init() {} init(id: UUID? = nil, title: String, isCompleted: Bool = false) { self.id = id self.title = title self.isCompleted = isCompleted }}Usamos Fluent, el ORM para Swift que trabaja con bases de datos. En nuestro ejemplo, usaremos SQLite por simplicidad. Observe el protocolo Content: permite codificar/decodificar automáticamente el modelo a JSON.
Configuración de la migración y la base de datos
Ahora crearemos una migración para nuestro modelo. Agregue el archivo CreateTodo.swift en la carpeta Sources/App/Migrations:
import Fluent
struct CreateTodo: Migration { func prepare(on database: Database) -> EventLoopFuture<Void> { return database.schema("todos") .id() .field("title", .string, .required) .field("is_completed", .bool, .required) .create() } func revert(on database: Database) -> EventLoopFuture<Void> { return database.schema("todos").delete() }}En el archivo configure.swift, agregue el registro de la base de datos y la migración:
import Fluentimport FluentSQLiteDriver
public func configure(_ app: Application) throws { app.databases.use(.sqlite(.file("db.sqlite")), as: .sqlite) app.migrations.add(CreateTodo())