查询字符串:它是什么?
查询字符串是 URL 的可选部分,它允许我们传递参数。我们用问号“?”将查询字符串与用户的域部分分开,每个参数都用“&”分隔。
以下是一些示例:
http:{baseUrl}?ids=2&ids=4&ids=6
http:{baseUrl}?同上=2&firstName=john&lastName=doe
通常,当我们需要从查询字符串中读取数据时,我们处于 ASP.NET 项目中,我们可以从 Request 对象读取数据。
//get the firstName from the query string
var hasHeader = Request.Query.
TryGetValue("firstName", out var firstNameValue);
如果我们在没有 HttpRequet 对象为我们处理解析的项目中获取字符串形式的 URL,它会变得更加复杂。
用例:
我们已经构建了一个非常酷的应用程序,现在我们希望我们的用户了解我们,因此我们需要在几个不同的网站和社交媒体上做广告。但我们也想知道我们的广告在哪些方面更有效,这样我们就不会浪费钱。最简单的方法是在广告中放置的网站链接中添加一些查询参数,让我们知道用户来自哪里。
例如,以下链接将告诉我们用户点击了来自 Facebook 的链接,以及用户点击的广告类型(我们可能需要更改广告,直到找到有效的策略)
https://bestAppEver.com?site=FB&活动=12
在托管我们网站的服务器上,每次用户打开我们的页面时,我们都会从请求中读取查询字符串值(如果我们有多个域,则读取整个 URL),并将其保存在数据库中以供以后分析。
每天一次,我们可以检查一下我们的数据库,读取今天的页面加载数据,看看我们的潜在客户来自哪里。
var todaysPageLoads = await ReadFromDB();
foreach(var link in todaysPageLoads)
{
var qs= QueryString.ParseQueryString(link);
var site=qs.GetValue("site");
var campaign=qs.GetValue("campaign");
await DoSomthingWithTheData(site , campaign);
}
那么,我们如何处理查询字符串呢?
public class QueryString
{
private readonly Dictionary<string, string> _data;
public QueryString(string url)
{
_data = ParseQueryString(url);
}
public string ReturnQueryString(Func<KeyValuePair<string, string>, string> parseMethod = null, bool prefixQuestionMark = true)
{
var list = _data.Select(pair => parseMethod == null ? $"{pair.Key}={pair.Value}" : parseMethod(pair)).ToList();
return (prefixQuestionMark ? "?" : string.Empty) + string.Join("&", list);
}
public static string CreateQueryString(Dictionary<string, string> data, bool prefixQuestionMark = true)
{
var qs = string.Join("&", data.Where(d => !string.IsNullOrEmpty(d.Value)).Select(d => $"{d.Key}={d.Value}"));
return (prefixQuestionMark ? "?" : "") + qs;
}
#region insert
public QueryString Insert(string key, string value)
{
InsertKey(_data, key, value);
return this;
}
public QueryString Insert(Dictionary<string, string> paramList)
{
foreach (var item in paramList)
{
Insert(item.Key, item.Value);
}
return this;
}
#endregion
#region delete
public QueryString DeleteKey(string key)
{
_data.Remove(key);
return this;
}
public QueryString DeleteKeys(List<string> keys)
{
foreach (var key in keys)
{
DeleteKey(key);
}
return this;
}
#endregion
#region update
public QueryString RenameKey(string oldKey, string newKey)
{
if (_data.ContainsKey(oldKey))
{
var value = _data[oldKey];
_data.Remove(oldKey);
_data[newKey] = value;
}
return this;
}
public QueryString RenameKeys(Dictionary<string, string> paramList)
{
foreach (var item in paramList)
{
RenameKey(item.Key, item.Value);
}
return this;
}
public QueryString UpdateValue(string key, string value )
{
UpdateKeyValue(_data, key, value);
return this;
}
public QueryString UpdateValue(Dictionary<string, string> paramList )
{
foreach (var item in paramList)
{
UpdateValue(item.Key, item.Value );
}
return this;
}
#endregion
public Dictionary<string, string> GetQueryStringParams()
{
return _data;
}
public static string GetQueryStringValue(string url, string key)
{
var data = ParseQueryString(url );
var hasValue = data.TryGetValue(key, out var value);
return hasValue ? value : null;
}
public static Dictionary<string, string> ParseQueryString(string url )
{
var data = new Dictionary<string, string>();
url = DecodeUrlString(url);
if (!url.Contains("?"))
{
url += "?" + url;
}
var urlParts = url.Split("?".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
if (string.IsNullOrEmpty(urlParts[1]))
{
return data;
}
var queryStringParams = urlParts[1].Split("&".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
foreach (var qsParam in queryStringParams)
{
var paramParts = qsParam.Split("=".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var key = paramParts[0];
var value = paramParts.Length == 2 ? paramParts[1] : string.Empty;
InsertKey(data, key, value);
}
return data;
}
public string GetValue(string key)
{
var hasValue = _data.TryGetValue(key, out var value);
return hasValue ? value : null;
}
#region Private
private static void InsertKey(Dictionary<string, string> data, string key, string value)
{
if (data.ContainsKey(key))
{
UpdateKeyValue(data, key, value);
}
else
{
data.Add(key, value);
}
}
private static void UpdateKeyValue(Dictionary<string, string> data, string key, string value)
{
data[key] = value;
}
private static string DecodeUrlString(string url)
{
string newUrl;
while ((newUrl = Uri.UnescapeDataString(url)) != url)
{
url = newUrl;
}
return newUrl;
}
#endregion
}
我们可以使用 QueryString 类来处理所有与查询字符串相关的任务。
我们可以使用构造函数或静态方法将字符串解析为 QueryString 对象。
var qs= QueryString.ParseQueryString(link);
var qs2 = new QueryString(link);
如果我们想从 QueryString 中读取参数:
var site=qs.GetValue("site");
(如果未找到该值,则返回 NULL)
编辑查询字符串:
从查询字符串中读取最常见的用例,但有时我们可能需要更改它,添加新的参数或更新其值。
让我们看看它是如何完成的:
qs.Insert(“firstName”, “first”).Insert(“lastName”, “last”);
qs.Insert("up", "down").UpdateValue("up", "up");
qs.DeleteKey("firstName").RenameKey("lastName", "last");
QueryString 调用可以:插入值、更新值、删除值和重命名参数键。(这些方法对单个项目或列表具有重载)。
如果我们想在更改更新查询字符串后将其作为字符串获取:
var url = qs.ReturnQueryString();
源代码获取:公众号回复消息【code:79817
】