Получите индивидуальные параметры запроса от Uri

У меня есть строка uri вроде: http://example.com/file?a=1&b=2&c=string%20param

Есть ли существующая функция, которая преобразует строку параметров запроса в словарь так же, как это делает ASP.NET Context.Request.

Я пишу консольное приложение, а не веб-сервис, так что Context.Request не анализирует URL для меня.

Я знаю, что довольно легко взломать строку запроса, но я бы предпочел использовать функцию FCL, если она существует.

Ответ 1

Используйте это:

string uri = ...;
string queryString = new System.Uri(uri).Query;
var queryDictionary = System.Web.HttpUtility.ParseQueryString(queryString);

Этот код от Tejs не является "правильным" способом получения строки запроса из URI:

string.Join(string.Empty, uri.Split('?').Skip(1));

Ответ 2

Вы можете использовать:

var queryString = url.Substring(url.IndexOf('?')).Split('#')[0]
System.Web.HttpUtility.ParseQueryString(queryString)

MSDN

Ответ 3

Это должно работать:

string url = "http://example.com/file?a=1&b=2&c=string%20param";
string querystring = url.Substring(url.IndexOf('?'));
System.Collections.Specialized.NameValueCollection parameters = 
   System.Web.HttpUtility.ParseQueryString(querystring);

Согласно MSDN. Не точный тип коллекции, который вы ищете, но тем не менее полезен.

Изменить: По-видимому, если вы укажете полный URL-адрес ParseQueryString, он добавит 'http://example.com/file?a 'как первый ключ коллекции. Поскольку это, вероятно, не то, что вы хотите, я добавил подстроку, чтобы получить только соответствующую часть URL.

Ответ 4

Я должен был сделать это для современного приложения Windows. Я использовал следующее:

public static class UriExtensions
{
    private static readonly Regex _regex = new Regex(@"[?|&]([\w\.]+)=([^?|^&]+)");

    public static IReadOnlyDictionary<string, string> ParseQueryString(this Uri uri)
    {
        var match = _regex.Match(uri.PathAndQuery);
        var paramaters = new Dictionary<string, string>();
        while (match.Success)
        {
            paramaters.Add(match.Groups[1].Value, match.Groups[2].Value);
            match = match.NextMatch();
        }
        return paramaters;
    }
}

EDIT: это обновление согласно предложению MaYaN

Ответ 5

Посмотрите HttpUtility.ParseQueryString() Он даст вам NameValueCollection вместо словаря, но все равно должен делать то, что вам нужно.

Другой вариант - использовать string.Split().

    string url = @"http://example.com/file?a=1&b=2&c=string%20param";
    string[] parts = url.Split(new char[] {'?','&'});
    ///parts[0] now contains http://example.com/file
    ///parts[1] = "a=1"
    ///parts[2] = "b=2"
    ///parts[3] = "c=string%20param"

Ответ 6

Для изолированных проектов, где зависимости должны быть сведены к минимуму, я обнаружил, что использую эту реализацию:

var arguments = uri.Query
  .Substring(1) // Remove '?'
  .Split('&')
  .Select(q => q.Split('='))
  .ToDictionary(q => q.FirstOrDefault(), q => q.Skip(1).FirstOrDefault());

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

Ответ 7

В одной строке кода:

string xyz = Uri.UnescapeDataString(HttpUtility.ParseQueryString(Request.QueryString.ToString()).Get("XYZ"));

Ответ 10

Вы можете ссылаться на System.Web в своем консольном приложении, а затем искать функции Utility, которые разделяют параметры URL.