J'ai donc une autre approche, similaire à tous ceux qui ont utilisé UriBuilder.
Je ne voulais pas diviser ma BaseUrl (qui peut contenir une partie du chemin - par exemple http://mybaseurl.com/dev/ ) comme javajavajavajavajava .
L'extrait suivant montre le code + tests.
Attention: cette solution met en minuscule l'hôte et ajoute un port. Si cela n'est pas souhaité, on peut écrire une représentation sous forme de chaîne en utilisant par exemple la Uri
propriété de UriBuilder
.
public class Tests
{
public static string CombineUrl (string baseUrl, string path)
{
var uriBuilder = new UriBuilder (baseUrl);
uriBuilder.Path = Path.Combine (uriBuilder.Path, path);
return uriBuilder.ToString();
}
[TestCase("http://MyUrl.com/", "/Images/Image.jpg", "http://myurl.com:80/Images/Image.jpg")]
[TestCase("http://MyUrl.com/basePath", "/Images/Image.jpg", "http://myurl.com:80/Images/Image.jpg")]
[TestCase("http://MyUrl.com/basePath", "Images/Image.jpg", "http://myurl.com:80/basePath/Images/Image.jpg")]
[TestCase("http://MyUrl.com/basePath/", "Images/Image.jpg", "http://myurl.com:80/basePath/Images/Image.jpg")]
public void Test1 (string baseUrl, string path, string expected)
{
var result = CombineUrl (baseUrl, path);
Assert.That (result, Is.EqualTo (expected));
}
}
Testé avec .NET Core 2.1 sur Windows 10.
Pourquoi ça marche?
Même s'il Path.Combine
renverra des barres obliques inverses (au moins sur Windows), l'UriBuilder gère ce cas dans le Setter de Path
.
Tiré de https://github.com/dotnet/corefx/blob/master/src/System.Private.Uri/src/System/UriBuilder.cs (attention à l'appel à string.Replace
)
[AllowNull]
public string Path
{
get
{
return _path;
}
set
{
if ((value == null) || (value.Length == 0))
{
value = "/";
}
_path = Uri.InternalEscapeString(value.Replace('\\', '/'));
_changed = true;
}
}
Est-ce la meilleure approche?
Certes, cette solution est assez auto-descriptive (du moins à mon avis). Mais vous comptez sur la "fonctionnalité" non documentée (au moins, je n'ai rien trouvé avec une recherche rapide sur Google) de l'API .NET. Cela peut changer avec une future version, veuillez donc couvrir la méthode avec des tests.
Il existe des tests dans https://github.com/dotnet/corefx/blob/master/src/System.Private.Uri/tests/FunctionalTests/UriBuilderTests.cs ( Path_Get_Set
) qui vérifient si le \
est correctement transformé.
Note latérale: On pourrait également travailler UriBuilder.Uri
directement avec la propriété, si l'uri sera utilisé pour un System.Uri
ctor.
Url.Combine
méthode qui fait exactement cela.