Как построить объект Url/Uri в C#? - CodeHelper

Как построить объект Url/Uri в C#?

1

Стоит задача сконструировать сложный URL с большим числом параметров. Хочется это сделать в объектной манере, не работая напрямую с конкатенацией и форматированием строк. Что-то типа такого:

var uri = new Uri("http://example.com");
uri.AddQueryParameter("paramName", paramValue);
uri.AddQueryParameter("paramName2", paramValue2);
uri.AddQueryParameter("paramName3", paramValue3);
return url.ToString();

вместо

return string.Format(
    "http://example.com?paramName={0}&paramName2={1}&paramName3={2}",
    paramValue,
    paramValue2,
    paramValue3);

Новые ответы


1

Есть класс HttpValueCollection, который используется в ASP.NET. Служит этот класс как раз для того, чтобы преобразовывать коллекцию элементов ключ-значение в строку запроса URI. К сожалению, напрямую инстанцировать объект этого класса не получится, потому что он является внутренним. Но можно вызвать статичекий метод System.Web.HttpUtility.ParseQueryString, возвращающий экземпляр базового класса — NameValueCollection:

var paramsCollection = System.Web.HttpUtility
    .ParseQueryString(string.Empty);        1

paramsCollection["param1"] = "paramValue1"; 2
paramsCollection["param1"] = "paramValue1";
//...
var uri = new Uri("http://example.com");
uri.Query = paramsCollection.ToString();    3

1 — метод ParseQueryString возвращает обычную коллекцию NameValueCollection, в которую можно добавлять ключи и значения. Но на самом деле это объект класса HttpValueCollection и при вызове ToString ключи-значения будут преобразованы в строку запроса.

2 — заполняем коллекцию.

3 — устанавливаем строку запроса для объекта URI.

2

С помощью метода-расширения:

    public static class UriExtensions {
    public static Uri AddQueryParameter(this Uri uri, string name, object value) {
        var builder = new UriBuilder(uri);
        if(builder.Query!=null&&builder.Query.Length>1) {
            builder.Query = string.Format("{0}&{1}={2}", builder.Query.Substring(1), name, value);
        }else {
            builder.Query = string.Format("{0}={1}", name, value);
        }
        return builder.Uri;
    }
}

можно написать так:

var uri = new Uri("http://alexey-algel.blogspot.com/search")
        .AddQueryParameter("updated-max", new DateTime(2010, 1, 24, 23, 10, 0).ToString("yyyy-MM-ddTHH:mm:sszzz"))
        .AddQueryParameter("max-results", 7);
Console.WriteLine(uri.ToString());

В результате получится такая строка:

http://alexey-algel.blogspot.com/search?updated-max=2010-01-24T23:10:00+03:00&max-results=7

v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.