Introdução: por que REST API em Swift é rápido e moderno
O desenvolvimento de aplicativos móveis para iOS e macOS exige não apenas uma interface bonita, mas também um backend de servidor confiável. REST API (Representational State Transfer) continua sendo o padrão de facto para troca de dados entre cliente e servidor. Se você já programa em Swift para o ecossistema Apple, criar a API na mesma linguagem é um passo lógico. Isso permite reutilizar modelos de dados, evitar duplicação de código e implementar mudanças mais rapidamente.
Neste artigo, mostraremos como escrever uma REST API completa em Swift usando o framework Vapor — o framework web mais popular para Swift. Você aprenderá como configurar o projeto, criar rotas, processar JSON e iniciar o servidor. Todo o processo levará no máximo 30 minutos. Pronto? Vamos lá!
1. Preparação do ambiente e instalação do Vapor
Antes de escrever código, certifique-se de ter as ferramentas necessárias instaladas. Para trabalhar com Vapor, você precisará do Swift 5.9 ou superior (recomenda-se Swift 6). Você também precisará de um terminal e um editor de código (Xcode ou VS Code).
Instalação do Vapor Toolbox
Vapor Toolbox é um utilitário de linha de comando que simplifica a criação e o gerenciamento de projetos. Instale-o via Homebrew:
brew install vaporSe o Homebrew não estiver instalado, baixe-o em brew.sh. Após a instalação, verifique a versão:
vapor --versionCriação de um novo projeto
Abra o terminal e execute o comando:
vapor new MyAPI --template=apiA flag --template=api cria uma estrutura básica para REST API sem arquivos desnecessários. Navegue até a pasta do projeto:
cd MyAPIAgora abra o projeto no Xcode:
open Package.swiftOu use qualquer outro editor. Pronto! Você tem um template limpo do Vapor.
2. Estrutura básica: models, controllers e rotas
Vapor usa a arquitetura MVC (Model-View-Controller), adaptada para desenvolvimento server-side. Criaremos uma API simples para gerenciar uma lista de tarefas (To-Do list).
Criação do model
O model é uma estrutura que descreve os dados. Na pasta Sources/App/Models/, crie o arquivo Todo.swift:
import Fluentimport Vapor
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 — ORM do Vapor para trabalhar com bancos de dados. O model é automaticamente serializado para JSON graças ao protocolo Content.
Criação do controller
O controller contém a lógica de processamento das requisições. Crie o arquivo Sources/App/Controllers/TodoController.swift:
import Vaporimport Fluent
struct TodoController: RouteCollection { func boot(routes: RoutesBuilder) throws { let todos = routes.grouped("todos") todos.get(use: index) todos.post(use: create) todos.group(":todoID") { todo in todo.delete(use: delete) } } // GET /todos — obter todas as tarefas func index(req: Request) async throws -> [Todo] { try await Todo.query(on: req.db).all() } // POST /todos — criar uma tarefa func create(req: Request) async throws -> Todo { let todo = try req.content.decode(Todo.self) try await todo.save(on: req.db) return todo } // DELETE /todos/:id — deletar uma tarefa func delete(req: R