Einführung: Swift – Nicht nur für mobile Apps
Viele Entwickler sind daran gewöhnt, Swift ausschließlich mit iOS und macOS zu assoziieren. Allerdings hat sich diese Sprache längst über das Apple-Ökosystem hinausbewegt. Mit dem Aufkommen von serverseitigen Frameworks wie Vapor und Kitura ist Swift zu einem vollwertigen Werkzeug für die Backend-Entwicklung geworden. In diesem Artikel werden wir in 30 Minuten eine vollständige REST-API in Swift mit dem Vapor-Framework schreiben. Sie lernen, wie Sie ein Projekt einrichten, Endpunkte erstellen, eine Datenbank verbinden und Fehler behandeln. Bereit? Los geht's!
Schritt 1: Installation und Einrichtung des Projekts
Stellen Sie zunächst sicher, dass Swift 5.5 oder neuer installiert ist. Sie können die Version mit dem Befehl überprüfen:
swift --version
Installieren Sie als nächstes Vapor Toolbox – ein Dienstprogramm zur Verwaltung von Projekten:
brew install vapor
Erstellen wir nun ein neues Projekt:
vapor new MyAPI --template=api
Dieser Befehl erstellt eine Ordnerstruktur mit einer fertigen API-Vorlage. Navigieren Sie zum Projektordner und führen Sie den Build aus:
cd MyAPI
vapor build
Wenn der Build erfolgreich ist, starten Sie den Server:
vapor run
Standardmäßig ist der Server unter http://127.0.0.1:8080 erreichbar. Öffnen Sie Ihren Browser und gehen Sie zu dieser Adresse – Sie sollten eine Begrüßungsnachricht sehen.
Vapor-Projektstruktur
- Sources/App – das Hauptverzeichnis mit dem Anwendungscode
- Sources/App/Controllers – Controller zur Bearbeitung von Anfragen
- Sources/App/Models – Datenmodelle
- Sources/App/routes.swift – Datei zum Registrieren von Routen
- configure.swift – Konfiguration der Anwendung und Datenbank
Schritt 2: Erstellen des Datenmodells und der Datenbank
Für dieses Beispiel erstellen wir eine einfache API zur Verwaltung einer To-Do-Liste. Beginnen wir mit dem Datenmodell. Erstellen Sie eine Datei Todo.swift im Ordner 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
}
}
Erstellen wir nun eine Migration für die Tabelle. In der Datei 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()
}
}
Vergessen Sie nicht, die Migration in configure.swift zu registrieren:
app.migrations.add(CreateTodo())
Der Einfachheit halber verwenden wir SQLite (eine integrierte Datenbank). Fügen Sie dies zu configure.swift hinzu:
app.databases.use(.sqlite(.file("db.sqlite")), as: .sqlite)
Schritt 3: Erstellen von REST-API-Endpunkten
Kommen wir zum interessantesten Teil – der Implementierung von CRUD-Operationen. Erstellen Sie einen Controller TodoController.swift im Ordner 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)