Cómo escribir una API REST en Swift en 30 minutos: guía práctica

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

Introducción: ¿Por qué Swift es adecuado para una API REST?

\n\n

Cuando se habla de desarrollo de servidores, Swift no es el primer lenguaje que viene a la mente. Sin embargo, con la aparición del framework Vapor (y su alternativa, Kitura), Swift se ha convertido en una herramienta completa para crear API REST. ¿Por qué usar Swift en el servidor? En primer lugar, es un lenguaje unificado para iOS, macOS y backend: puedes reutilizar modelos de datos. En segundo lugar, Swift es rápido, seguro y tiene un excelente soporte para asincronía mediante async/await.

\n\n

En esta guía crearemos una API REST simple para gestionar una lista de tareas (Todo list) en Swift utilizando el framework Vapor. Aprenderás a configurar el servidor, crear rutas, trabajar con JSON y probar la API. Todo el proceso tomará unos 30 minutos.

\n\n

Paso 1: Instalación y configuración del proyecto

\n\n

Antes de escribir código, necesitas instalar Vapor Toolbox, una utilidad de línea de comandos para crear y gestionar proyectos Vapor.

\n\n

Instalación de Vapor Toolbox

\n

Abre la terminal y ejecuta:

\n
brew install vapor
\n

Si no tienes Homebrew, instálalo desde brew.sh.

\n\n

Creación de un nuevo proyecto

\n

Crearemos un nuevo proyecto llamado TodoAPI:

\n
vapor new TodoAPI -n\ncd TodoAPI
\n

La bandera -n significa "sin ejemplo": obtendremos una plantilla limpia.

\n\n

Inicio del servidor

\n

Abre el proyecto en Xcode:

\n
open Package.swift
\n

Selecciona el esquema Run y presiona Cmd+R. Después de unos segundos, el servidor se iniciará en http://127.0.0.1:8080. Abre el navegador: deberías ver un mensaje de bienvenida de Vapor.

\n\n

Paso 2: Creación del modelo de datos

\n\n

Nuestra API gestionará tareas. Cada tarea tiene un ID, un título y un estado de finalización (completada/no completada).

\n\n

Crearemos el modelo Todo. En Vapor, los modelos son estructuras comunes que cumplen con el protocolo Content (para serialización a JSON) y Codable.

\n\n

Crea el archivo Sources/App/Models/Todo.swift:

\n
import Vapor\n\nstruct Todo: Content, Codable {\n    var id: UUID?\n    var title: String\n    var isCompleted: Bool\n    \n    init(id: UUID? = nil, title: String, isCompleted: Bool = false) {\n        self.id = id\n        self.title = title\n        self.isCompleted = isCompleted\n    }\n}
\n\n

Ten en cuenta: id es un UUID opcional. Lo generaremos en el servidor al crear la tarea.

\n\n

Paso 3: Creación del almacenamiento y el controlador

\n\n

Para simplificar, almacenaremos las tareas en memoria (en un array). En un proyecto real usarías una base de datos (Fluent ORM), pero para una demo de 30 minutos es excesivo.

\n\n

Almacenamiento (In-Memory Store)

\n

Crea el archivo Sources/App/Controllers/TodoStore.swift:

\n
import Vapor\n\nfinal class TodoStore {\n    private var todos: [Todo] = []\n    private let lock = NSLock()\n    \n    func getAll() -> [Todo] {\n        lock.lock()\n        defer { lock.unlock() }\n        return todos\n    }\n    \n    func get(id: UUID) -> Todo? {\n        lock.lock()\n        defer { lock.unlock() }\n        return todos.first { $0.id == id }\n    }\n    \n    func create(_ todo: inout Todo) -> Todo {\n        lock.lock()\n        defer { lock.unlock() }\n        todo.id = UUID()\n        todos.append(todo)\n        return todo\n    }\n    \n    func update(id: UUID, with updatedTodo: Todo) -> Todo? {\n        lock.lock()\n        defer { lock.unlock() }\n        guard let index = todos.firstIndex(where: { $0.id == id }) else { return nil }\n        var mutableTodo = updatedTodo\n        mutableTodo.id = id\n        todos[index] = mutableTodo\n        return mutableTodo\n    }\n    \n    func delete(id: UUID) ->                

Blogs

Book Recommendations