Как сохранить весь параметр из uri в список C # [duplicate]

Другое решение, основанное на ответе dyslexicanaboko , но не зависящее от текущей культуры:

public static string ToTrimmedString(this decimal num)
{
    string str = num.ToString();
    string decimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
    if (str.Contains(decimalSeparator))
    {
        str = str.TrimEnd('0');
        if(str.EndsWith(decimalSeparator))
        {
            str = str.RemoveFromEnd(1);
        }
    }
    return str;
}

public static string RemoveFromEnd(this string str, int characterCount)
{
    return str.Remove(str.Length - characterCount, characterCount);
}

94
задан Ghostrider 21 May 2010 в 19:25
поделиться

10 ответов

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

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));
85
ответ дан Timothy Shields 21 August 2018 в 01:18
поделиться
  • 1
    Обратите внимание, что Uri.Query будет работать только на абсолютном Uri. По относительной она выбрасывает InvalidOperationExeception. – ghord 23 June 2013 в 12:46

Посмотрите на 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"
12
ответ дан 3Dave 21 August 2018 в 01:18
поделиться

Microsoft Azure предлагает структуру, которая упрощает ее выполнение. http://azure.github.io/azure-mobile-services/iOS/v2/Classes/MSTable.html#//api/name/readWithQueryString:completion :

0
ответ дан Alex Bedro 21 August 2018 в 01:18
поделиться

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

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

MSDN

113
ответ дан Eugene Beresovsky 21 August 2018 в 01:18
поделиться
  • 1
    Но вам нужно добавить ссылку на System.Web.dll. – SLaks 21 May 2010 в 19:28
  • 2
    Как еще один ответ, ParseQueryString добавит ' example.com/file?a' ; как первый ключ. – Rune 25 October 2012 в 11:58
  • 3
    Обновлен с новым кодом. Как ни странно, этот ответ кажется очень популярным. – Tejs 6 November 2012 в 23:47
  • 4
    Еще одна вещь, которую следует иметь в виду: ParseQueryString ALWAYS выполняет UrlDecode при синтаксическом анализе, что прекрасно, если у вас нет ничего, полагающегося на индивидуальное сходство, например, как алгоритм подписи в привязке переадресации SAML, который вычисляет подпись ПОСЛЕ кодирования с другой стороны и т. д. – Michael Hallock 8 August 2013 в 21:39
  • 5
    Split('#')[0] вернет левую часть реального или мнимого фрагмента . Вот спецификация относительно размещения фрагмента по запросу : RFC 3986 – bvj 12 May 2017 в 03:08

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

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

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

5
ответ дан Johny Skovdal 21 August 2018 в 01:18
поделиться

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

string xyz = Uri.UnescapeDataString(HttpUtility.ParseQueryString(Request.QueryString.ToString()).Get("XYZ"));
4
ответ дан Pabinator 21 August 2018 в 01:18
поделиться

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

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 . Не точный тип коллекции, который вы ищете, но тем не менее полезен.

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

25
ответ дан pyrocumulus 21 August 2018 в 01:18
поделиться

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

-2
ответ дан Raj 21 August 2018 в 01:18
поделиться

Ниже приведена ссылка для ссылки на использование класса HttpUtility для анализа значений запроса: http://dnohr.dk/aspnet/how-to-get-url-querystring-variables-from-a-string- URL-с-CSharp

0
ответ дан user3215480 21 August 2018 в 01:18
поделиться

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

public static class UriExtensions
{
    private static readonly Regex _regex = new Regex(@"[?&](\w[\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;
    }
}
15
ответ дан Wiktor Stribiżew 21 August 2018 в 01:18
поделиться
  • 1
    Регулярное выражение не захватывает параметры с помощью «.». в середине, например: user.name – MaYaN 2 October 2014 в 00:58
  • 2
    Регулярное выражение должно быть: «[? | & Amp;] ([\ w \.] +) = ([^? | ^ & Amp;] +)" – MaYaN 2 October 2014 в 01:02
  • 3
    Работал! Благодаря! – Vinícius Fonseca 9 April 2015 в 16:50
  • 4
    @Ross Dargan: это хорошее решение, но я бы предложил создать объект regex с помощью RegexOptions.Compiled, согласно этой документации , так как он статичен и предназначен для повторного использования. – easuter 20 February 2016 в 15:48
  • 5
    Я обновил регулярное выражение до @"[?&](\w[\w.]*)=([^?&]+)", так как [|?]& также соответствует | и [^?|^&] соответствует любому символу, но ? / | / ^ и &. – Wiktor Stribiżew 13 April 2018 в 08:43
Другие вопросы по тегам:

Похожие вопросы: