Introdução: por que Swift para REST API?
Swift não é apenas uma linguagem para aplicativos móveis. Graças a frameworks como Vapor e Kitura, você pode criar REST API completas para o lado do servidor. Isso é especialmente útil se seu aplicativo iOS já usa Swift: você pode escrever tanto o cliente quanto o servidor na mesma linguagem, reduzindo o tempo de desenvolvimento e simplificando a manutenção do código.
Neste artigo, criaremos uma REST API simples em Swift usando o framework Vapor — a solução mais popular para desenvolvimento server-side em Swift. Configuraremos o servidor, adicionaremos rotas para operações CRUD e o testaremos. Todo o processo levará no máximo 30 minutos.
Requisitos: macOS ou Linux, Swift 5.8+ (ou superior) instalado, compreensão básica de HTTP e JSON.
Passo 1: Instalação e configuração do projeto Vapor
O Vapor fornece uma ferramenta CLI conveniente para início rápido. Instale-a via Homebrew:
brew install vaporEm seguida, crie um novo projeto:
vapor new MyAPI --template=apicd MyAPIA flag --template=api cria um esqueleto com estrutura mínima para REST API. Após criar o projeto, abra-o no Xcode (ou qualquer editor):
open Package.swiftA estrutura do projeto inclui:
Sources/App/— lógica principal (rotas, controladores, modelos).Sources/App/routes.swift— registro de rotas.Sources/App/configure.swift— configuração da aplicação.Package.swift— dependências (Vapor já incluído).
Se você usa Xcode, ele baixará as dependências automaticamente. No terminal, execute vapor build para compilar.
Passo 2: Criação do modelo de dados e banco de dados
Para a REST API, precisamos de um modelo. Vamos criar um modelo simples Task (tarefa) com campos: id, title, completed. No Vapor, modelos geralmente herdam de Model (Fluent ORM).
Crie o arquivo 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 }}Agora, crie uma migração para a tabela no banco de dados. Crie o arquivo 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() }}Adicione a migração no configure.swift:
app.migrations.add(CreateTask())Por padrão, o Vapor usa SQLite (arquivo na pasta do projeto). Se quiser PostgreSQL ou MySQL — altere as configurações no configure.swift, mas para início rápido, SQLite é perfeito.
Passo 3: Registro das rotas da REST API
Agora, crie um controlador para processar as requisições. Crie o arquivo 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