C# 技巧 :如何查询 queryString

作者:微信公众号:【架构师老卢】
7-4 18:43
35

概述:查询字符串:它是什么?查询字符串是 URL 的可选部分,它允许我们传递参数。我们用问号“?”将查询字符串与用户的域部分分开,每个参数都用“”分隔。以下是一些示例:http:{baseUrl}?ids=2ids=4ids=6http:{baseUrl}?ids=2,4,6http:{baseUrl}?同上=2firstName=johnlastName=doe通常,当我们需要从查询字符串中读取数据时,我们处于 ASP.NET 项目中,我们可以从 Request 对象读取数据。//get the firstName from the query string var hasHeader = Re

查询字符串:它是什么?
查询字符串是 URL 的可选部分,它允许我们传递参数。我们用问号“?”将查询字符串与用户的域部分分开,每个参数都用“&”分隔。
以下是一些示例:

http:{baseUrl}?ids=2&ids=4&ids=6

http:{baseUrl}?ids=2,4,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 的链接,以及用户点击的广告类型(我们可能需要更改广告,直到找到有效的策略)

http://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

相关代码下载地址
重要提示!:取消关注公众号后将无法再启用回复功能,不支持解封!
第一步:微信扫码关键公众号“架构师老卢”
第二步:在公众号聊天框发送code:79817,如:code:79817 获取下载地址
第三步:恭喜你,快去下载你想要的资源吧
阅读排行