从。net中的字符串中获取URL参数

我在。net中有一个字符串,实际上是一个URL。我想要一种简单的方法从特定的参数中获取值。

通常,我只使用Request.Params["theThingIWant"],但这个字符串不是来自请求。我可以像这样创建一个新的Uri项:

Uri myUri = new Uri(TheStringUrlIWantMyValueFrom);

我可以使用myUri.Query来获取查询字符串…但显然我得找个雷克斯风的方法把它分开。

我是否遗漏了一些明显的东西,或者是否没有内置的方法来创建某种类型的正则表达式,等等?

492213 次浏览

看起来你应该遍历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

使用返回NameValueCollectionSystem.Web.HttpUtility类的静态ParseQueryString方法。

Uri myUri = new Uri("http://www.example.com?param1=good&param2=bad");
string param1 = HttpUtility.ParseQueryString(myUri.Query).Get("param1");

http://msdn.microsoft.com/en-us/library/ms150046.aspx检查文档

使用. net Reflector查看System.Web.HttpValueCollectionFillFromString方法。这为您提供了ASP。NET用来填充Request.QueryString集合。

这可能就是你想要的

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");

@Andrew和@CZFox

我有同样的错误,并发现原因是参数一实际上是:http://www.example.com?param1而不是param1,这是人们所期望的。

通过删除问号之前的所有字符并包括问号可以解决这个问题。因此,本质上,HttpUtility.ParseQueryString函数只需要一个有效的查询字符串参数,其中只包含问号后面的字符,例如:

HttpUtility.ParseQueryString ( "param1=good&param2=bad" )

我的解决方案:

string RawUrl = "http://www.example.com?param1=good&param2=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");

如果出于任何原因,你不能或不想使用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);
}
}
}

如果你想在默认页面上获得你的QueryString。默认页面意味着你当前页面的url。 您可以尝试以下代码:

string paramIl = HttpUtility.ParseQueryString(this.ClientQueryString).Get("city");
HttpContext.Current.Request.QueryString.Get("id");

或者如果你不知道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;
}

我用过,运行得很好

<%=Request.QueryString["id"] %>

这其实很简单,对我来说很管用:)

        if (id == "DK")
{
string longurl = "selectServer.aspx?country=";
var uriBuilder = new UriBuilder(longurl);
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
query["country"] = "DK";


uriBuilder.Query = query.ToString();
longurl = uriBuilder.ToString();
}

对于任何想要从字符串中循环所有查询字符串的人

        foreach (var item in new Uri(urlString).Query.TrimStart('?').Split('&'))
{
var subStrings = item.Split('=');


var key = subStrings[0];
var value = subStrings[1];


// do something with values
}

单线LINQ解决方案:

Dictionary<string, string> ParseQueryString(string query)
{
return query.Replace("?", "").Split('&').ToDictionary(pair => pair.Split('=').First(), pair => pair.Split('=').Last());
}

你可以只使用Uri来获取查询字符串列表或找到特定的参数。

Uri myUri = new Uri("http://www.example.com?param1=good&param2=bad");
var params = myUri.ParseQueryString();
var specific = myUri.ParseQueryString().Get("param1");
var paramByIndex = myUri.ParseQueryString().Get(2);

你可以从这里找到更多:https://learn.microsoft.com/en-us/dotnet/api/system.uri?view=net-5.0

获取参数名称的最简单方法:

using System.Linq;
string loc = "https://localhost:5000/path?desiredparam=that_value&anotherParam=whatever";


var c = loc.Split("desiredparam=").Last().Split("&").First();//that_value

下面是一个示例,其中提到了要包含哪些dll

var testUrl = "https://www.google.com/?q=foo";


var data = new Uri(testUrl);


// Add a reference to System.Web.dll
var args = System.Web.HttpUtility.ParseQueryString(data.Query);


args.Set("q", "my search term");


var nextUrl = $"{data.Scheme}://{data.Host}{data.LocalPath}?{args.ToString()}";