Получить параметры URL-адрес из строки in.NET
у меня есть строка в .NET, которая на самом деле является url. Я хочу простой способ получить значение из определенного параметра.
обычно я просто использую Request.Params["theThingIWant"]
, но эта строка не из запроса. Я могу создать новый Uri
пункт вот так:
Uri myUri = new Uri(TheStringUrlIWantMyValueFrom);
Я могу использовать myUri.Query
получить строку запроса...но тогда мне, по-видимому, нужно найти какой-то регулярный способ разделить его.
я упускаю что-то очевидное, или нет встроенного способа сделать это за исключением создания какого-то регулярного выражения и т. д.?
11 ответов:
использовать статические
ParseQueryString
методSystem.Web.HttpUtility
класс, который возвращаетNameValueCollection
.Uri myUri = new Uri("http://www.example.com?param1=good¶m2=bad"); string param1 = HttpUtility.ParseQueryString(myUri.Query).Get("param1");
проверьте документацию по адресу http://msdn.microsoft.com/en-us/library/ms150046.aspx
Это, вероятно, то, что вы хотите
var uri = new Uri("http://domain.test/Default.aspx?var1=true&var2=test&var3=3"); var query = HttpUtility.ParseQueryString(uri.Query); var var2 = query.Get("var2");
вот еще одна альтернатива, если по каким-то причинам вы не можете или не хотите использовать
HttpUtility.ParseQueryString()
.это построено, чтобы быть несколько терпимым к "искаженным" строкам запроса, т. е.
http://test/test.html?empty=
будет параметр с пустым значением. Абонент может проверить параметры, если это необходимо.public static class UriHelper { public static Dictionary<string, string> DecodeQueryParameters(this Uri uri) { if (uri == null) throw new ArgumentNullException("uri"); if (uri.Query.Length == 0) return new Dictionary<string, string>(); return uri.Query.TrimStart('?') .Split(new[] { '&', ';' }, StringSplitOptions.RemoveEmptyEntries) .Select(parameter => parameter.Split(new[] { '=' }, StringSplitOptions.RemoveEmptyEntries)) .GroupBy(parts => parts[0], parts => parts.Length > 2 ? string.Join("=", parts, 1, parts.Length - 1) : (parts.Length > 1 ? parts[1] : "")) .ToDictionary(grouping => grouping.Key, grouping => string.Join(",", grouping)); } }
тест
[TestClass] public class UriHelperTest { [TestMethod] public void DecodeQueryParameters() { DecodeQueryParametersTest("http://test/test.html", new Dictionary<string, string>()); DecodeQueryParametersTest("http://test/test.html?", new Dictionary<string, string>()); DecodeQueryParametersTest("http://test/test.html?key=bla/blub.xml", new Dictionary<string, string> { { "key", "bla/blub.xml" } }); DecodeQueryParametersTest("http://test/test.html?eins=1&zwei=2", new Dictionary<string, string> { { "eins", "1" }, { "zwei", "2" } }); DecodeQueryParametersTest("http://test/test.html?empty", new Dictionary<string, string> { { "empty", "" } }); DecodeQueryParametersTest("http://test/test.html?empty=", new Dictionary<string, string> { { "empty", "" } }); DecodeQueryParametersTest("http://test/test.html?key=1&", new Dictionary<string, string> { { "key", "1" } }); DecodeQueryParametersTest("http://test/test.html?key=value?&b=c", new Dictionary<string, string> { { "key", "value?" }, { "b", "c" } }); DecodeQueryParametersTest("http://test/test.html?key=value=what", new Dictionary<string, string> { { "key", "value=what" } }); DecodeQueryParametersTest("http://www.google.com/search?q=energy+edge&rls=com.microsoft:en-au&ie=UTF-8&oe=UTF-8&startIndex=&startPage=1%22", new Dictionary<string, string> { { "q", "energy+edge" }, { "rls", "com.microsoft:en-au" }, { "ie", "UTF-8" }, { "oe", "UTF-8" }, { "startIndex", "" }, { "startPage", "1%22" }, }); DecodeQueryParametersTest("http://test/test.html?key=value;key=anotherValue", new Dictionary<string, string> { { "key", "value,anotherValue" } }); } private static void DecodeQueryParametersTest(string uri, Dictionary<string, string> expected) { Dictionary<string, string> parameters = new Uri(uri).DecodeQueryParameters(); Assert.AreEqual(expected.Count, parameters.Count, "Wrong parameter count. Uri: {0}", uri); foreach (var key in expected.Keys) { Assert.IsTrue(parameters.ContainsKey(key), "Missing parameter key {0}. Uri: {1}", key, uri); Assert.AreEqual(expected[key], parameters[key], "Wrong parameter value for {0}. Uri: {1}", parameters[key], uri); } } }
Похоже, вы должны перебирать значения
myUri.Query
и разобрать его оттуда.string desiredValue; foreach(string item in myUri.Query.Split('&')) { string[] parts = item.Replace('?', '').Split('='); if(parts[0] == "desiredKey") { desiredValue = parts[1]; break; } }
Я бы не использовал этот код, не проверяя его на куче искаженных URL-адресов. Он может сломаться на некоторых/всех из них:
hello.html?
hello.html?valuelesskey
hello.html?key=value=hi
hello.html?hi=value?&b=c
- etc
@Andrew и @CZFox
у меня была та же ошибка, и я обнаружил, что причиной является тот параметр, который на самом деле:
http://www.example.com?param1
, а неparam1
что и следовало ожидать.путем удаления всех символов до и включая знак вопроса устраняет эту проблему. Так что по сути
HttpUtility.ParseQueryString
функция требует только допустимый параметр строки запроса, содержащий только символы после знака вопроса, как в:HttpUtility.ParseQueryString ( "param1=good¶m2=bad" )
мое решение:
string RawUrl = "http://www.example.com?param1=good¶m2=bad"; int index = RawUrl.IndexOf ( "?" ); if ( index > 0 ) RawUrl = RawUrl.Substring ( index ).Remove ( 0, 1 ); Uri myUri = new Uri( RawUrl, UriKind.RelativeOrAbsolute); string param1 = HttpUtility.ParseQueryString( myUri.Query ).Get( "param1" );`
вы можете использовать следующий обходной путь для его работы с первым параметром тоже:
var param1 = HttpUtility.ParseQueryString(url.Substring( new []{0, url.IndexOf('?')}.Max() )).Get("param1");
используйте .NET Reflector для просмотра
FillFromString
методSystem.Web.HttpValueCollection
. Это дает вам код, который ASP.NET используется для заполненияRequest.QueryString
коллекция.
или если вы не знаете URL (чтобы избежать жесткого кодирования, используйте
AbsoluteUri
пример ...
//get the full URL Uri myUri = new Uri(Request.Url.AbsoluteUri); //get any parameters string strStatus = HttpUtility.ParseQueryString(myUri.Query).Get("status"); string strMsg = HttpUtility.ParseQueryString(myUri.Query).Get("message"); switch (strStatus.ToUpper()) { case "OK": webMessageBox.Show("EMAILS SENT!"); break; case "ER": webMessageBox.Show("EMAILS SENT, BUT ... " + strMsg); break; }