API in Swift: Von der Theorie zu echten Anfragen
\n\nJeder iOS-Entwickler steht früher oder später vor der Notwendigkeit, dass die App mit einem Server kommuniziert. Ob das Laden eines Nachrichtenfeeds, das Senden von Formulardaten oder Streaming in Echtzeit – ohne API (Application Programming Interface) geht es nicht. Aber welches Protokoll soll man wählen? Das klassische REST, das flexible GraphQL oder das extrem schnelle gRPC?
\n\nIn diesem Artikel listen wir nicht nur Vor- und Nachteile auf. Wir analysieren die Arbeit mit APIs in Swift anhand realer Beispiele, zeigen Code und geben praktische Tipps. Sie erfahren, wie Sie die Netzwerkschicht richtig strukturieren, welche Bibliotheken Sie verwenden sollten und wann jeder Ansatz die beste Wahl ist.
\n\nWenn Sie in Swift programmieren und möchten, dass Ihre App schnell, zuverlässig und elegant mit dem Backend kommuniziert – dann ist dieser Artikel für Sie. Los geht's!
\n\nREST API in Swift: Ein Klassiker, der nicht altert
\n\nREST (Representational State Transfer) ist ein Architekturstil, der HTTP-Methoden (GET, POST, PUT, DELETE) zur Arbeit mit Ressourcen verwendet. Die meisten öffentlichen APIs (GitHub, Twitter, Stripe) basieren auf REST. Für einen Swift-Entwickler bedeutet das, dass Sie mit JSON, URLSession oder Alamofire arbeiten werden.
\n\nBasis-GET-Anfrage mit URLSession
\n\nBeginnen wir mit dem Einfachsten – dem Abrufen von Daten. Stellen wir uns vor, wir müssen eine Liste von Benutzern von JSONPlaceholder laden:
\n\nimport Foundation\n\nstruct User: Codable {\n let id: Int\n let name: String\n let email: String\n}\n\nfunc fetchUsers() async throws -> [User] {\n let url = URL(string: "https://jsonplaceholder.typicode.com/users")!\n let (data, response) = try await URLSession.shared.data(from: url)\n \n guard let httpResponse = response as? HTTPURLResponse,\n (200...299).contains(httpResponse.statusCode) else {\n throw URLError(.badServerResponse)\n }\n \n return try JSONDecoder().decode([User].self, from: data)\n}\n\nTask {\n do {\n let users = try await fetchUsers()\n print("Geladen \\(users.count) Benutzer")\n } catch {\n print("Fehler: \\(error.localizedDescription)")\n }\n}\n\nBeachten Sie die Verwendung von async/await – dies ist die moderne Art, mit asynchronem Code in Swift zu arbeiten. Der Code ist lesbar und kurz, ohne Closures und Callbacks.
POST-Anfrage mit Alamofire
\n\nAlamofire ist die beliebteste Bibliothek für die Netzwerkprogrammierung in Swift. Sie vereinfacht die Fehlerbehandlung, die Codierung von Parametern und das Hochladen von Dateien. Hier ist ein Beispiel zum Senden von Daten:
\n\nimport Alamofire\n\nstruct NewUser: Encodable {\n let name: String\n let email: String\n}\n\nAF.request("https://jsonplaceholder.typicode.com/users",\n method: .post,\n parameters: NewUser(name: "Ivan", email: "ivan@example.com"),\n encoder: JSONParameterEncoder.default)\n .validate()\n .responseDecodable(of: User.self) { response in\n switch response.result {\n case .success(let user):\n print("Benutzer mit id erstellt: \\(user.id)")\n case .failure(let error):\n print("Fehler: \\(error.localizedDescription)")\n }\n }\n\nTipp: Verwenden Sie .validate() – dies prüft automatisch den Statuscode und wandelt HTTP-Fehler in Alamofire-Fehler um. Ihr Code wird sauberer und das Debuggen einfacher.
Wann ist REST die beste Wahl?
\n- \n
- Sie haben eine einfache CRUD-Anwendung (Notizen, Aufgabenliste). \n
- Die API stellt feste Endpunkte bereit. \n
- Sie benötigen keine komplexe Datenverschachtelung. \n
GraphQL in Swift: Flexibilität bei Abfragen
\n\nGraphQL ist eine Abfragesprache, die es dem Client ermöglicht, genau die Daten anzufordern, die er benötigt. Kein Over-fetching (überflüssige Felder) oder Under-fetching (mehrere Anfragen nötig). Für Swift gibt es die hervorragende Bibliothek Apollo iOS