Z drugiej strony w przypadku operowania na stringach będących ścieżkami na dysku możemy skorzystać z metody
Path.Combine(), która bezpiecznie łączy dwa ciągi znaków. Dodając lub nie "\" w miejscu ich łączenia.W przypadku łączenia URL-i nie mamy gotowej metody w frameworku, która działała by w taki sam sposób jak
Path.Combine(). Można tu wykorzystać naturalną możliwość łączenia jaką daje konstruktor klasy Uri() jednak jego działanie nie będzie zgodne z oczekiwaniem. Dodatkowym problemem jest to, że nie można podać łączonych URL-i jako stringów.
string urlA = "http://example.org/info"; string urlB = "test.html"; Uri baseUri = new Uri(urlA); Uri pathUri = new Uri(urlB, UriKind.Relative); Console.Write(new Uri(baseUri, pathUri).ToString());
Wynikiem działania powyższego kodu będzie adres w postaci:
http://example.org/test.html. Nie taki był zamiar, bo zgodnie z oczekiwaniem adres miał wyglądać tak: http://example.org/info/test.html aby zachować zachowanie takie jak Path.Combine().
Gdy lekko zmodyfikujemy łączone adresy:
string urlA = "http://example.org/info/"; string urlB = "test.html";
To otrzymamy właściwy adres zgodnie z oczekiwaniem. A co gdy dołączana część adresu będzie się zaczynać od "
/"?
string urlA = "http://example.org/info/"; string urlB = "/test.html";
Otrzymamy znowu adres:
http://example.org/info.html, więc wróciliśmy do punktu wyjścia. Kilka spostrzeżeń:- Pierwsza część adresu musi zawsze kończyć się znakiem "
/" - druga część adresu nie może się zaczynać od znaku "
/"
string urlA = "http://example.org/info/";
string urlB = "/test.html";
Uri baseUri = new Uri((urlA.EndsWith("/") ? urlA : urlA + '/'));
Uri pathUri = new Uri(urlB.TrimStart('/'), UriKind.Relative);
Console.Write(new Uri(baseUri, pathUri).ToString());
Lub w bardziej przyjaznej formie metody:
public static string UrlCombine(string urlA, string urlB)
{
// dodajmy / na końcu gdy go nie ma
Uri baseUri = new Uri((urlA.EndsWith("/") ? urlA : urlA + '/'));
// zawsze usuwamy znak / z początku
Uri pathUri = new Uri(urlB.TrimStart('/'), UriKind.Relative);
return new Uri(baseUri, pathUri).ToString();
}
Omijając kilka właściwości klasy
Uri udało się stworzyć metodę, która może ułatwić i przyspieszyć prozaiczną czynność jak łączenie adresów.
Brak komentarzy:
Prześlij komentarz