Swift encode URL: Warum Ihr Code an Kyrillisch und Leerzeichen scheitert
Jeder Entwickler, der jemals eine Netzwerkanfrage in Swift gesendet hat, kennt diesen Schmerz: Sie erstellen eine URL, fügen Parameter hinzu, und der Server gibt einen 400-Fehler zurück oder, noch schlimmer, ignoriert die Anfrage stillschweigend. Kommt Ihnen das bekannt vor? Meistens liegt das Problem an einer falschen URL-Kodierung. Es scheint einfach genug — nehmen Sie einen String, ersetzen Sie Leerzeichen durch %20, und fertig. Aber Swift (wie jede strenge Sprache) toleriert keine schlampige Arbeit.
In diesem Artikel analysieren wir die 5 häufigsten Fehler bei der Swift encode URL, die tausende Aufrufe auf Stack Overflow sammeln. Sie lernen, wie Sie sie vermeiden und zuverlässigen Code schreiben, der mit allen Daten funktioniert — von englischen Buchstaben bis zu komplexem Kyrillisch und Sonderzeichen.
Fehler #1: Verwendung von addingPercentEncoding mit dem falschen Zeichensatz
Dies ist wohl die häufigste Falle. Viele Anfänger sehen die Methode addingPercentEncoding(withAllowedCharacters:) und denken: "Oh, perfekt!". Aber sie übergeben .urlHostAllowed oder .urlPathAllowed für die gesamte URL. Das Ergebnis — ein Absturz oder eine falsche Anfrage.
Warum funktioniert das nicht?
Jeder Teil der URL (Schema, Host, Pfad, Abfrageparameter) hat seinen eigenen erlaubten Zeichensatz. Wenn Sie die gesamte URL als Host kodieren, verlieren Sie Schrägstriche und Doppelpunkte. Wenn Sie sie als Pfad kodieren, zerstören Sie die Abfragezeichenfolge.
// ❌ Fehler: Kodierung der gesamten URL als Hostlet urlString = "https://example.com/path?name=Ivan & surname=Petrov"let encoded = urlString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)// Ergebnis: "https%3A%2F%2Fexample.com%2F%D0%BF%D1%83%D1%82%D1%8C%3Fname%3D%D0%98%D0%B2%D0%B0%D0%BD%20%26%20%D1%84%D0%B0%D0%BC%D0%B8%D0%BB%D0%B8%D1%8F%3D%D0%9F%D0%B5%D1%82%D1%80%D0%BE%D0%B2"// Der Server wird eine solche URL nicht verstehenDenken Sie an die goldene Regel: Kodieren Sie jeden Teil der URL separat oder verwenden Sie URLComponents.
Der richtige Ansatz: URLComponents
// ✅ Richtig: URLComponents verwendenvar components = URLComponents()components.scheme = "https"components.host = "example.com"components.path = "/path"components.queryItems = [ URLQueryItem(name: "name", value: "Ivan & Petrov"), URLQueryItem(name: "surname", value: "Ivanov")]
if let url = components.url { print(url.absoluteString) // "https://example.com/%D0%BF%D1%83%D1%82%D1%8C?name=%D0%98%D0%B2%D0%B0%D0%BD%20%26%20%D0%9F%D0%B5%D1%82%D1%80%D0%BE%D0%B2&%D1%84%D0%B0%D0%BC%D0%B8%D0%BB%D0%B8%D1%8F=%D0%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2"}URLComponents wendet automatisch die korrekte Prozentkodierung für jede Komponente an. Das erspart Ihnen Kopfschmerzen und macht den Code sauberer.
Fehler #2: Ignorieren von queryItems zugunsten manueller String-Erstellung
"Warum brauche ich diese Komponenten? Ich verkette einfach den String mit +". Kommt Ihnen bekannt vor? Und das führt zum zweiten häufigen Fehler. Das manuelle Erstellen einer Abfragezeichenfolge ist ein direkter Weg zu Fehlern.
// ❌ Fehler: Manuelle Erstellung der Abfragezeichenfolgelet name = "Ivan & Petrov"let query = "name=\\(name)&age=25"let urlString = "https://example.com?\\(query)"// Problem: Das kaufmännische Und im Namen wird als Parametertrenner interpretiertSelbst wenn Sie Leerzeichen ersetzen, vergessen Sie &, #, ? und andere Sonderzeichen. Und wenn der Parameter vom Benutzer kommt? Erwarten Sie Injektionen und fehlerhafte Anfragen.
Lösung: Immer queryItems verwenden
// ✅ Richtig: queryItems erledigt die ganze Arbeit für Sievar components = URLComponents(string: "https://example.com")!components.queryItems = [ URLQueryItem(name: "name", value: "Ivan & Petrov"), URLQueryItem(name: "age", value: "25"), URLQueryItem(name: "q", value: "Swift encode URL tutorial")]
if let url = components.url { print(url.absoluteStr