Como escrever uma REST API em Swift em 30 minutos: para iniciantes
Swift não é apenas uma linguagem para criar aplicativos móveis para iOS e macOS. Com o surgimento do framework Vapor, o desenvolvimento de aplicações servidoras em Swift tornou-se acessível e conveniente. Neste artigo, mostraremos como escrever uma REST API simples em Swift em apenas 30 minutos. Você aprenderá os princípios básicos de trabalho com Vapor, criará rotas, processará requisições e retornará respostas JSON.
Este guia é ideal para iniciantes que já conhecem os fundamentos do Swift, mas nunca escreveram código de servidor. Vamos analisar o processo passo a passo, com exemplos de código e explicações.
O que é uma REST API e para que serve?
REST (Representational State Transfer) é um estilo arquitetônico de interação entre componentes de uma aplicação distribuída em rede. Uma REST API permite que aplicações cliente (por exemplo, um aplicativo iOS) recebam e enviem dados para o servidor através de requisições HTTP.
Os principais métodos HTTP usados em REST:
- GET — obter dados
- POST — criar um novo recurso
- PUT — atualizar um recurso existente
- DELETE — excluir um recurso
Para nosso exemplo, criaremos uma API simples para gerenciar uma lista de tarefas (Todo List). Ela suportará todas as quatro operações básicas de CRUD (Create, Read, Update, Delete).
Instalação do Vapor e criação do projeto
Vapor é o framework web mais popular para Swift. Para começar, instale o Vapor Toolbox via Homebrew:
brew install vaporApós a instalação, crie um novo projeto:
vapor new TodoAPIcd TodoAPIEste comando criará a estrutura do projeto com um servidor já configurado. Abra o projeto no Xcode:
open Package.swiftNo Xcode, você verá a estrutura padrão de um projeto Vapor. O código principal está na pasta Sources/App.
Criação do modelo de dados
Para trabalhar com tarefas, precisamos de um modelo. Crie o arquivo Todo.swift na pasta 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 }}Estamos usando Fluent — um ORM para Swift que trabalha com bancos de dados. No nosso exemplo, usaremos SQLite para simplificar. Observe o protocolo Content — ele permite codificar/decodificar automaticamente o modelo em JSON.
Configuração da migração e do banco de dados
Agora, crie uma migração para o nosso modelo. Adicione o arquivo CreateTodo.swift na pasta 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() }}No arquivo configure.swift, adicione o registro do banco de dados e da migração:
import Fluentimport FluentSQLiteDriver
public func configure(_ app: Application) throws { app.databases.use(.sqlite(.file("db.sqlite")), as: .sqlite) app.migrations.add(CreateTodo())