C# net 对url追加路径或设置Query参数

发布时间 2024-01-04 15:56:38作者: 爱恋的红尘

C# net 对url追加路径或设置Query参数

C# net url AppendPathSegments SetQueryParams

 

        /// <summary>
        /// 追加路径片段(有更高要求可以使用Flurl库)
        /// </summary>
        /// <param name="url">地址,如 https://www.baidu.com</param>
        /// <param name="segments">路径片段</param>
        /// <returns>地址</returns>
        public static string AppendPathSegments(this string url, IEnumerable<object> segments)
        {
            string urlStr = url;
            foreach (var segment in segments)
            {
                var val = segment?.ToString();
                if (string.IsNullOrWhiteSpace(val))
                    continue;

                if (urlStr.EndsWith("/"))
                    urlStr = urlStr.Substring(0, urlStr.Length - 1);

                urlStr += val!.StartsWith("/") ? val : $"/{val}";
            }
            return urlStr;
        }

        /// <summary>
        /// 设置Query参数(有更高要求可以使用Flurl库)
        /// </summary>
        /// <param name="url">地址,如 https://www.baidu.com/s</param>
        /// <param name="values">参数,支持字典和对象</param>
        /// <returns>地址</returns>
        public static string SetQueryParams(this string url, object? values)
        {
            string urlStr = url;
            if (values == null)
                return urlStr;

            List<string> kv = new List<string>();
            if (values is IEnumerable jh)
            {
                if (jh is IDictionary dict)
                {
                    foreach (DictionaryEntry item in dict)
                        kv.Add($"{item.Key?.ToString()}={item.Value?.ToString()}");
                }
            }
            else
            {
                foreach (var item in values.GetType().GetProperties())
                {
                    if (item.CanRead)
                        kv.Add($"{item.Name}={item.GetValue(values)?.ToString()}");
                }
            }

            if (kv.Any())
            {
                if (!urlStr.EndsWith("?"))
                    urlStr += "?";

                urlStr += string.Join("&", kv);
            }

            return urlStr;
        }

  

使用方法:

            //http://www.test.com/a/b/c/1?t1=v1&t2=2&t3=v3&t4=4
            var url = "http://www.test.com/".AppendPathSegments(new object[] { "/a/", "b/", "c", 1 })
                .SetQueryParams(new { t1 = "v1", t2 = 2 })
                .SetQueryParams(new Dictionary<object, object>() { { "t3", "v3" }, { "t4", 4 } });

  

完成