Pourquoi Path.Combine casse les URL et comment y remédier ?
Imaginez : vous écrivez une application en C# qui accède à une API. Vous devez assembler une URL du type https://api.example.com/v1/users/123. La première idée qui vous vient est d'utiliser le familier Path.Combine. Et c'est une erreur que commettent des milliers de développeurs. La question « Path.Combine for URLs? » sur Stack Overflow a recueilli des centaines de milliers de vues — et ce n'est pas pour rien.
Dans cet article, nous allons voir pourquoi Path.Combine est mortellement dangereux pour les URL, et vous montrer 4 méthodes correctes pour assembler des adresses en C#. Vous apprendrez comment fonctionne UriBuilder, pourquoi il faut envisager la bibliothèque Flurl et comment écrire votre propre méthode sécurisée de fusion d'URL. C'est parti !
Le problème : qu'est-ce qui cloche avec Path.Combine ?
La méthode Path.Combine a été conçue pour les systèmes de fichiers Windows. Elle utilise la barre oblique inversée (\\) et tient compte des spécificités des disques (par exemple, C:\\). Les URL, quant à elles, utilisent la barre oblique (/) et n'ont pas de notion de « disque ». Regardons un exemple :
string baseUrl = "https://api.example.com/api";string endpoint = "/users/123";string result = Path.Combine(baseUrl, endpoint);Console.WriteLine(result);// Sortie : https:\\\\api.example.com\\api\\users\\123 (sur Windows)// Ou pire encore : https://api.example.com/api/users/123 (si vous avez de la chance)Le résultat est, pour le moins, invalide. Path.Combine remplace les barres obliques par des barres obliques inversées (sous Windows), et votre requête HTTP échouera avec une erreur. Même si sous Linux tout semble normal, le code devient non portable. Et si l'URL de base a déjà une barre oblique à la fin ? Ou si le endpoint a une double barre oblique ? Le cauchemar commence.
Exemple réel issu de Stack Overflow
L'une des réponses les plus populaires à la question « Path.Combine for URLs? » (auteur — Brian, plus de 600 votes positifs) commence par cette phrase : « S'il vous plaît, ne faites pas cela. Path.Combine est pour les fichiers, pas pour les URL. » Et c'est une règle d'or. Voyons quels outils C# propose pour travailler en toute sécurité avec les URL.
Méthode 1 : Uri.TryCreate — méthode intégrée .NET
La première méthode, la plus évidente, consiste à utiliser la classe Uri. Elle sait correctement fusionner une URL de base et un chemin relatif :
string baseUrl = "https://api.example.com/api";string relativePath = "/users/123";
if (Uri.TryCreate(baseUrl, relativePath, out Uri result)){ Console.WriteLine(result.ToString()); // Sortie : https://api.example.com/users/123}else{ Console.WriteLine("URL invalide");}Important : le deuxième argument de TryCreate doit être un URI relatif (commençant par /). Si vous passez simplement "users/123", il sera interprété comme absolu — et le résultat sera incorrect. Ce n'est pas la méthode la plus flexible, mais pour les cas simples, c'est une excellente solution intégrée.
Méthode 2 : UriBuilder — puissant et flexible
La classe UriBuilder offre un contrôle total sur chaque partie de l'URL : schéma, hôte, port, chemin et paramètres de requête. C'est le choix idéal lorsque vous devez assembler une adresse complexe :
var builder = new UriBuilder("https://api.example.com");builder.Port = 8080;builder.Path = "/api/v1/users";builder.Query = "page=1&limit=10";
Uri uri = builder.Uri;Console.WriteLine(uri.ToString());// Sortie : https://api.example.com:8080/api/v1/users?page=1&limit=10Pourquoi est-ce génial ?
- Échappement automatique — les caractères spéciaux dans les paramètres de requête seront encodés.
- Barres obliques correctes —
UriBuilderajoute ou supprime lui-même les barres obliques superflues. - Ports et schémas — facile de passer de http à https ou d'ajouter un port.
Mais il y a un détail : Path
Blogs
Book Recommendations
Lire aussi
Travailler avec JSON en Kotlin : analyse et sérialisation pour débutants
Scinder une chaîne en Rust : 5 erreurs fatales et comment les éviter
Limitation des requêtes en JavaScript : comment ne pas faire tomber l'API
Utilitaires CLI en Rust : comment écrire votre premier outil en une soirée
Requêtes WHERE multiples dans Laravel Eloquent : du débutant au pro