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 URLRappelez-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ètresMê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