Introdução: Swift não é apenas para aplicativos móveis
Muitos desenvolvedores estão acostumados a associar Swift exclusivamente com iOS e macOS. No entanto, esta linguagem há muito ultrapassou os limites do ecossistema Apple. Com o surgimento de frameworks server-side, como Vapor e Kitura, o Swift se tornou uma ferramenta completa para a criação de backend. Neste artigo, em 30 minutos, escreveremos uma API REST completa em Swift usando o framework Vapor. Você aprenderá como configurar o projeto, criar endpoints, conectar um banco de dados e tratar erros. Pronto? Vamos lá!
Passo 1: Instalação e configuração do projeto
Para começar, certifique-se de ter o Swift 5.5 ou superior instalado. Você pode verificar a versão com o comando:
swift --version
Em seguida, instale o Vapor Toolbox — um utilitário para gerenciar projetos:
brew install vapor
Agora vamos criar um novo projeto:
vapor new MyAPI --template=api
Este comando criará uma estrutura de pastas com um template de API pronto. Navegue até a pasta do projeto e inicie a compilação:
cd MyAPI
vapor build
Se a compilação for bem-sucedida, inicie o servidor:
vapor run
Por padrão, o servidor estará disponível em http://127.0.0.1:8080. Abra o navegador e acesse este endereço — você deverá ver uma mensagem de boas-vindas.
Estrutura do projeto Vapor
- Sources/App — diretório principal com o código da aplicação
- Sources/App/Controllers — controllers para processar requisições
- Sources/App/Models — modelos de dados
- Sources/App/routes.swift — arquivo para registrar as rotas
- configure.swift — configuração da aplicação e do banco de dados
Passo 2: Criando o modelo de dados e o banco de dados
Como exemplo, vamos criar uma API simples para gerenciar uma lista de tarefas (Todo). Começaremos com o modelo de dados. Crie o arquivo Todo.swift na pasta Sources/App/Models:
import Fluent
import 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
}
}
Agora vamos criar a migração para a tabela. No arquivo Sources/App/Migrations/CreateTodo.swift:
import Fluent
struct CreateTodo: Migration {
func prepare(on database: Database) -> EventLoopFuture<Void> {
database.schema("todos")
.id()
.field("title", .string, .required)
.field("is_completed", .bool, .required)
.create()
}
func revert(on database: Database) -> EventLoopFuture<Void> {
database.schema("todos").delete()
}
}
Não se esqueça de registrar a migração no configure.swift:
app.migrations.add(CreateTodo())
Para simplificar, usaremos SQLite (banco de dados embutido). Adicione no configure.swift:
app.databases.use(.sqlite(.file("db.sqlite")), as: .sqlite)
Passo 3: Criando os endpoints da REST API
Agora a parte mais interessante — a implementação das operações CRUD. Crie o controller TodoController.swift na pasta Sources/App/Controllers:
import Vapor
struct TodoController: RouteCollection {
func boot(routes: RoutesBuilder) throws {
let todos = routes.grouped("api", "todos")
todos.get(use: index)
todos.post(use: create)
todos.group(":todoID") { todo in
todo.get(use: show)
```