Как надежно построить URL в C #, используя части? - PullRequest
36 голосов
/ 16 июля 2009

Я продолжаю чувствовать, что заново изобретаю колесо, поэтому я решил спросить здесь толпу. Представьте, что у меня есть такой фрагмент кода:

string protocol = "http"; // Pretend this value is retrieved from a config file
string host = "www.google.com"; // Pretend this value is retrieved from a config file
string path = "plans/worlddomination.html"; // Pretend this value is retrieved from a config file

Я хочу создать URL-адрес "http://www.google.com/plans/worlddomination.html". Я продолжаю делать это, записывая глупый код, подобный этому:

protocol = protocol.EndsWith("://") ? protocol : protocol + "://";
path = path.StartsWith("/") ? path : "/" + path;    
string fullUrl = string.Format("{0}{1}{2}", protocol, host, path);

Что мне действительно нужно, так это какой-то API-интерфейс:

UrlBuilder builder = new UrlBuilder();
builder.Protocol = protocol;
builder.Host = host;
builder.Path = path;
builder.QueryString = null;
string fullUrl = builder.ToString();

Я должен верить, что это где-то существует в .NET Framework, но нигде не сталкивался.

Каков наилучший способ создания защищенных от ошибок (т. Е. Никогда не искаженных) URL-адресов?

Ответы [ 2 ]

43 голосов
/ 16 июля 2009

Проверьте класс UriBuilder

26 голосов
/ 21 февраля 2014

UriBuilder отлично подходит для работы с битами в начале URL (например, протокол), но ничего не предлагает на стороне строки запроса. Flurl [раскрытие: я автор] пытается заполнить этот пробел с некоторой беглостью совершенства:

using Flurl;

var url = "http://www.some-api.com"
    .AppendPathSegment("endpoint")
    .SetQueryParams(new {
        api_key = ConfigurationManager.AppSettings["SomeApiKey"],
        max_results = 20,
        q = "Don't worry, I'll get encoded!"
    });

Существует новая сопутствующая библиотека, которая расширяет свободную цепочку с помощью клиентских вызовов HTTP и включает в себя некоторые изящные функции тестирования . Полный пакет доступен на NuGet:

PM> Install-Package Flurl.Http

или просто автономный построитель URL:

PM> Install-Package Flurl

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...