Einleitung: Warum Swift für REST APIs geeignet ist
\n\nWenn es um Serverentwicklung geht, ist Swift nicht die erste Sprache, die einem in den Sinn kommt. Doch mit dem Aufkommen des Frameworks Vapor (und seiner Alternative Kitura) ist Swift zu einem vollwertigen Werkzeug für die Erstellung von REST APIs geworden. Warum Swift auf dem Server verwenden? Erstens ist es eine einheitliche Sprache für iOS, macOS und das Backend – Sie können Datenmodelle wiederverwenden. Zweitens ist Swift schnell, sicher und bietet hervorragende Unterstützung für Asynchronität durch async/await.
\n\nIn dieser Anleitung erstellen wir eine einfache REST API zur Verwaltung einer Aufgabenliste (Todo-Liste) in Swift mit dem Framework Vapor. Sie lernen, wie Sie einen Server konfigurieren, Routen erstellen, mit JSON arbeiten und die API testen. Der gesamte Prozess dauert etwa 30 Minuten.
\n\nSchritt 1: Installation und Projekteinrichtung
\n\nBevor wir Code schreiben, müssen wir die Vapor Toolbox installieren – ein Kommandozeilenwerkzeug zum Erstellen und Verwalten von Vapor-Projekten.
\n\nInstallation der Vapor Toolbox
\nÖffnen Sie das Terminal und führen Sie Folgendes aus:
\nbrew install vapor\nWenn Sie Homebrew nicht haben, installieren Sie es von brew.sh.
\n\nEin neues Projekt erstellen
\nErstellen wir ein neues Projekt mit dem Namen TodoAPI:
vapor new TodoAPI -n\ncd TodoAPI\nDas Flag -n bedeutet „ohne Beispiel“ – wir erhalten eine leere Vorlage.
Server starten
\nÖffnen Sie das Projekt in Xcode:
\nopen Package.swift\nWählen Sie das Schema Run und drücken Sie Cmd+R. Nach einigen Sekunden startet der Server unter http://127.0.0.1:8080. Öffnen Sie den Browser – Sie sollten eine Begrüßungsnachricht von Vapor sehen.
Schritt 2: Erstellen des Datenmodells
\n\nUnsere API wird Aufgaben verwalten. Jede Aufgabe hat eine ID, einen Titel und einen Erledigungsstatus (erledigt/nicht erledigt).
\n\nErstellen wir das Modell Todo. In Vapor sind Modelle normale Strukturen, die den Protokollen Content (für die JSON-Serialisierung) und Codable entsprechen.
Erstellen Sie die Datei Sources/App/Models/Todo.swift:
\nimport Vapor\n\nstruct Todo: Content, Codable {\n var id: UUID?\n var title: String\n var isCompleted: Bool\n \n init(id: UUID? = nil, title: String, isCompleted: Bool = false) {\n self.id = id\n self.title = title\n self.isCompleted = isCompleted\n }\n}\n\nBeachten Sie: id ist eine optionale UUID. Wir werden sie beim Erstellen der Aufgabe auf dem Server generieren.
Schritt 3: Erstellen des Speichers und des Controllers
\n\nDer Einfachheit halber speichern wir Aufgaben im Arbeitsspeicher (in einem Array). In einem echten Projekt würden Sie eine Datenbank (Fluent ORM) verwenden, aber für eine 30-minütige Demo ist das übertrieben.
\n\nSpeicher (In-Memory Store)
\nErstellen Sie die Datei Sources/App/Controllers/TodoStore.swift:
\nimport Vapor\n\nfinal class TodoStore {\n private var todos: [Todo] = []\n private let lock = NSLock()\n \n func getAll() -> [Todo] {\n lock.lock()\n defer { lock.unlock() }\n return todos\n }\n \n func get(id: UUID) -> Todo? {\n lock.lock()\n defer { lock.unlock() }\n return todos.first { $0.id == id }\n }\n \n func create(_ todo: inout Todo) -> Todo {\n lock.lock()\n defer { lock.unlock() }\n todo.id = UUID()\n todos.append(todo)\n return todo\n }\n \n func update(id: UUID, with updatedTodo: Todo) -> Todo? {\n lock.lock()\n defer { lock.unlock() }\n guard let index = todos.firstIndex(where: { $0.id == id }) else { return nil }\n var mutableTodo = updatedTodo\n mutableTodo.id = id\n todos[index] = mutableTodo\n return mutableTodo\n }\n \n func delete(id: UUID) ->