Получить отдельные параметры запроса из Uri [дубликат]
этот вопрос уже есть ответ здесь:
Получить параметры URL-адрес из строки .Чистая
11 ответов
У меня есть строка uri, например:http://example.com/file?a=1&b=2&c=string%20param
существует ли функция, которая преобразует строку параметра запроса в словарь так же, как ASP.NET Контекст.Запрос делает это.
Я пишу консольное приложение, а не веб-сервис, поэтому нет никакой связи.Запрос для разбора URL-адрес для меня.
Я знаю, что довольно легко взломать строку запроса самостоятельно, но я бы предпочел использовать функцию FCL, если она существует.
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));
вы можете использовать:
var queryString = url.Substring(url.IndexOf('?')).Split('#')[0] System.Web.HttpUtility.ParseQueryString(queryString)
Это должно работать:
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. Не точный collectiontype вы ищете, но тем не менее полезно.
Edit: по-видимому, если вы предоставите полный url-адрес
ParseQueryStringОн добавит'http://example.com/file?a ' как первый ключ коллекции. Поскольку это, вероятно, не то, что вы хотите, я добавил подстроку, чтобы получить только соответствующую часть url.
Я должен был сделать это для современного 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; } }
посмотреть 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"
для изолированных проектов, где зависимости должны быть сведены к минимуму, я обнаружил, что использую эту реализацию:
var arguments = uri.Query .Substring(1) // Remove '?' .Split('&') .Select(q => q.Split('=')) .ToDictionary(q => q.FirstOrDefault(), q => q.Skip(1).FirstOrDefault());однако следует отметить, что я не обрабатываю закодированные строки любого рода, поскольку я использовал это в контролируемой среде, где проблемы кодирования были бы ошибкой кодирования на стороне сервера, которая должна быть исправлена.
в одной строке кода:
string xyz = Uri.UnescapeDataString(HttpUtility.ParseQueryString(Request.QueryString.ToString()).Get("XYZ"));
Ниже приведена ссылка для вашей ссылки на использование класса HttpUtility для анализа значений строки запроса: http://dnohr.dk/aspnet/how-to-get-url-querystring-variables-from-a-string-url-with-csharp
Microsoft Azure предлагает платформу, которая позволяет легко выполнить это. http://azure.github.io/azure-mobile-services/iOS/v2/Classes/MSTable.html#//api/name/readWithQueryString:completion:
вы можете ссылаться на систему.Web в консольном приложении, а затем найдите служебные функции, которые разделяют параметры URL.
Comments