Swift encode URL : 5 erreurs fatales et comment les éviter

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Swift encode URL : pourquoi votre code plante avec le cyrillique et les espaces



Chaque développeur qui a déjà envoyé une requête réseau en Swift a connu cette douleur : vous formez une URL, ajoutez des paramètres, et le serveur renvoie une erreur 400 ou, pire encore, ignore silencieusement la requête. Cela vous semble familier ? La plupart du temps, le problème vient d'un encodage d'URL incorrect. Cela semble assez simple — prenez une chaîne, remplacez les espaces par %20, et le tour est joué. Mais Swift (comme tout langage strict) ne tolère pas le travail bâclé.



Dans cet article, nous allons décortiquer les 5 erreurs les plus courantes lors du Swift encode URL, qui cumulent des milliers de vues sur Stack Overflow. Vous apprendrez à les éviter et à écrire un code fiable qui fonctionne avec toutes les données — des lettres anglaises aux caractères cyrilliques complexes et aux caractères spéciaux.



Erreur n°1 : Utiliser addingPercentEncoding avec le mauvais jeu de caractères



C'est peut-être l'écueil le plus populaire. De nombreux débutants voient la méthode addingPercentEncoding(withAllowedCharacters:) et pensent : "Oh, parfait !". Mais ils passent .urlHostAllowed ou .urlPathAllowed pour l'URL entière. Le résultat — un plantage ou une requête incorrecte.



Pourquoi cela ne fonctionne-t-il pas ?



Chaque partie de l'URL (schéma, hôte, chemin, paramètres de requête) a son propre jeu de caractères autorisés. Si vous encodez l'URL entière comme un hôte, vous perdrez les slashes et les deux-points. Si vous l'encodez comme un chemin, vous casserez la chaîne de requête.



// ❌ Erreur : encoder l'URL entière comme un hôtelet urlString = "https://example.com/path?name=Ivan & surname=Petrov"let encoded = urlString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)// Résultat : "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"// Le serveur ne comprendra pas une telle URL


Rappelez-vous la règle d'or : encodez chaque partie de l'URL séparément ou utilisez URLComponents.



L'approche correcte : URLComponents



// ✅ Correct : utilisez URLComponentsvar 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 applique automatiquement le pourcentage d'encodage correct pour chaque composant. Cela vous évite des maux de tête et rend le code plus propre.



Erreur n°2 : Ignorer queryItems au profit d'une construction manuelle de chaîne



"Pourquoi ai-je besoin de ces composants ? Je vais juste concaténer la chaîne avec +". Cela vous semble familier ? Et cela mène à la deuxième erreur populaire. Construire manuellement une chaîne de requête est un chemin direct vers les bugs.



// ❌ Erreur : construction manuelle de la chaîne de requêtelet name = "Ivan & Petrov"let query = "name=\\(name)&age=25"let urlString = "https://example.com?\\(query)"// Problème : l'esperluette dans le nom sera interprétée comme un séparateur de paramètres


Même si vous remplacez les espaces, vous oublierez &, #, ? et autres caractères spéciaux. Et si le paramètre vient de l'utilisateur ? Attendez-vous à des injections et des requêtes cassées.



Solution : utilisez toujours queryItems



// ✅ Correct : queryItems fait tout le travail pour vousvar 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

Blogs

Book Recommendations