Einleitung: Warum es wichtig ist, mit HTTP in Swift arbeiten zu können
\nModerne mobile und Desktop-Anwendungen existieren selten isoliert. Praktisch jede App – vom Wetter-Widget bis zur Banking-Anwendung – tauscht Daten mit einem Server aus. Dafür wird das HTTP-Protokoll verwendet, und auf der Swift-Seite (iOS/macOS) ist das Hauptwerkzeug das Framework Foundation und seine Klasse URLSession.
In diesem Artikel werden wir durchgehen, wie man einen HTTP-Client in Swift richtig erstellt: von einer einfachen GET-Anfrage bis hin zu komplexer Fehlerbehandlung und Arbeit mit JSON. Das Material wird sowohl für Anfänger nützlich sein, die gerade erst mit der iOS-Entwicklung beginnen, als auch für erfahrene Entwickler, die ihr Wissen systematisieren möchten.
\nWir betrachten den modernen Ansatz mit async/await (Swift 5.5+), der den Code sauber und lesbar macht, und gehen auch auf die klassischen Methoden mit Completion-Handlern (completion handlers) für die Abwärtskompatibilität ein.
Grundlagen von URLSession: Erstellung und Konfiguration
\nDie Klasse URLSession ist der Haupt-"Dirigent" von Netzwerkanfragen in Swift. Sie verwaltet Verbindungen, Caching und Authentifizierung. Bevor man Anfragen stellt, muss man eine Instanz der Session erstellen.
Session-Typen
\n- \n
- Shared (Singleton):
URLSession.shared– eine einfache Session ohne Anpassung. Geeignet für grundlegende Anfragen. \n - Default:
URLSession(configuration: .default)– ermöglicht die Konfiguration von Timeouts, Cache und Headern. \n - Ephemeral:
URLSession(configuration: .ephemeral)– speichert weder Cache noch Cookies auf der Festplatte. Ideal für private Daten. \n - Background:
URLSession(configuration: .background(withIdentifier:))– für Hintergrund-Downloads/-Uploads, auch wenn die App minimiert ist. \n
import Foundation\n\n// Einfache Session\nlet sharedSession = URLSession.shared\n\n// Benutzerdefinierte Session mit einem Timeout von 30 Sekunden\nlet config = URLSessionConfiguration.default\nconfig.timeoutIntervalForRequest = 30\nconfig.timeoutIntervalForResource = 60\nlet customSession = URLSession(configuration: config)\n\n\nErstellung und Versand von HTTP-Anfragen
\nDie Anfrage wird mit der Klasse URLRequest erstellt. Sie enthält die URL, die HTTP-Methode, Header und den Anfragekörper. Wir betrachten die wichtigsten Methoden: GET und POST.
GET-Anfrage mit async/await (moderner Ansatz)
\nAb Swift 5.5 hat Apple die Unterstützung für asynchrone Funktionen (async/await) hinzugefügt. Dies ist die prägnanteste und sicherste Art, mit dem Netzwerk zu arbeiten.
func fetchData(from urlString: String) async throws -> Data {\n guard let url = URL(string: urlString) else {\n throw URLError(.badURL)\n }\n \n var request = URLRequest(url: url)\n request.httpMethod = "GET"\n request.setValue("application/json", forHTTPHeaderField: "Accept")\n \n let (data, response) = try await URLSession.shared.data(for: request)\n \n // HTTP-Status prüfen\n guard let httpResponse = response as? HTTPURLResponse,\n (200...299).contains(httpResponse.statusCode) else {\n throw URLError(.badServerResponse)\n }\n \n return data\n}\n\n// Verwendung:\nTask {\n do {\n let data = try await fetchData(from: "https://api.example.com/users")\n print("Erhalten \\(data.count) Bytes")\n } catch {\n print("Fehler: \\(error.localizedDescription)")\n }\n}\n\n\nPOST-Anfrage mit JSON-Body
\nZum Senden von Daten an den Server wird die POST-Methode verwendet. Der Anfragekörper wird normalerweise in JSON kodiert.
\n\nstruct User: Codable {\n let name: String\n let email: String\n}\n\nfunc createUser(_ user: User) async throws -> Data {\n let url = URL(string: "https://api.example.com/users")!\n var request = URLRequest(url: url)\n request.httpMethod = "POST"\n request.setValue("application