From 5ccb2120bf6d30027d09b459a21759420dfaf5e6 Mon Sep 17 00:00:00 2001 From: Ogoun Date: Fri, 22 Nov 2019 01:31:03 +0300 Subject: [PATCH] UrlBuilder --- TestApp/Program.cs | 38 ++++++++-- TestApp/TestApp.csproj | 4 + ZeroLevel/Services/Web/UrlBuilder.cs | 106 +++++++++++++++++++++++++++ ZeroLevel/Services/Web/UrlUtility.cs | 4 +- 4 files changed, 146 insertions(+), 6 deletions(-) create mode 100644 ZeroLevel/Services/Web/UrlBuilder.cs diff --git a/TestApp/Program.cs b/TestApp/Program.cs index 6cb9b45..54bab42 100644 --- a/TestApp/Program.cs +++ b/TestApp/Program.cs @@ -1,13 +1,41 @@ -using System; -using ZeroLevel.Services; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using ZeroLevel.Services.Web; namespace TestApp { + public class TestQuery + { + public string Name { get; set; } + public int Age { get; set; } + public string[] Roles { get; set; } + } + internal static class Program { + private static string Serialize(object instance) + { + return JsonConvert.SerializeObject(instance); + } + private static void Main(string[] args) { - var fiber = new Fiber(); + var t = new TestQuery + { + Age = 133, + Roles = new[] { "ad\"\"\"min", "user", "operator" }, + Name = "su" + }; + var builder = new UrlBuilder(Serialize); + var url = builder.BuildRequestUrlFromDTO("http://google.com", "/api/v0/getuserinfo", t); + Console.WriteLine(url); + Console.ReadKey(); + + /*var fiber = new Fiber(); fiber .Add((s) => { Console.WriteLine("1"); s.Add("1", 1); return s; }) .Add((s) => { Console.WriteLine("2"); s.Add("2", 2); return s; }) @@ -21,9 +49,9 @@ namespace TestApp foreach (var key in result.Keys()) { Console.WriteLine($"{key}: {result.Get(key)}"); - } + }*/ + - Console.ReadKey(); /*Configuration.Save(Configuration.ReadFromApplicationConfig()); diff --git a/TestApp/TestApp.csproj b/TestApp/TestApp.csproj index c13cbb7..9f8c521 100644 --- a/TestApp/TestApp.csproj +++ b/TestApp/TestApp.csproj @@ -5,6 +5,10 @@ netcoreapp2.2 + + + + diff --git a/ZeroLevel/Services/Web/UrlBuilder.cs b/ZeroLevel/Services/Web/UrlBuilder.cs new file mode 100644 index 0000000..f1cff1a --- /dev/null +++ b/ZeroLevel/Services/Web/UrlBuilder.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Web; + +namespace ZeroLevel.Services.Web +{ + public class UrlBuilder + { + private readonly Func _serializer; + + public UrlBuilder(Func serializer) + { + _serializer = serializer; + } + + public Uri BuildRequestUrlFromDTO(string baseUri, string resource, T instance) + { + if (null == instance) + { + return BuildRequestUrl(baseUri, resource, null); + } + var members = typeof(T).GetMembers( + BindingFlags.Public | + BindingFlags.FlattenHierarchy | + BindingFlags.GetField | + BindingFlags.GetProperty | + BindingFlags.Instance); + var parameters = new Dictionary(); + foreach (var member in members) + { + switch (member.MemberType) + { + case MemberTypes.Property: + parameters.Add(member.Name.ToLowerInvariant(), (member as PropertyInfo).GetValue(instance)); + break; + case MemberTypes.Field: + parameters.Add(member.Name.ToLowerInvariant(), (member as FieldInfo).GetValue(instance)); + break; + default: + continue; + } + } + return BuildRequestUrl(baseUri, resource, parameters); + } + + public Uri BuildRequestUrl(string baseUri, string resource, IDictionary parameters) + { + if (null == resource) throw new ArgumentNullException("resource"); + var stringBuilder = new StringBuilder(baseUri); + if (baseUri[baseUri.Length - 1] != '/') + stringBuilder.Append('/'); + if (resource[0] != '/') + { + stringBuilder.Append(resource); + } + else + { + stringBuilder.Append(resource.Substring(1)); + } + if (parameters != null && parameters.Count > 0) + { + stringBuilder.Append("?"); + foreach (var pair in parameters) + { + if (pair.Value == null) + { + stringBuilder.Append(pair.Value); + } + else + { + var vtype = pair.Value.GetType(); + if (vtype.IsArray) + { + if (vtype.GetElementType() == typeof(string)) + { + var arr = (string[])pair.Value; + stringBuilder.Append(string.Join("&", arr.Select(i => $"{HttpUtility.UrlEncode(pair.Key)}[]={HttpUtility.UrlEncode(i)}"))); + } + else + { + var arr = (object[])pair.Value; + stringBuilder.Append(string.Join("&", arr.Select(i => $"{HttpUtility.UrlEncode(pair.Key)}[]={HttpUtility.UrlEncode(_serializer(i))}"))); + } + } + else + { + if (vtype == typeof(string)) + { + stringBuilder.Append($"{HttpUtility.UrlEncode(pair.Key)}={HttpUtility.UrlEncode((string)pair.Value)}"); + } + else + { + stringBuilder.Append($"{HttpUtility.UrlEncode(pair.Key)}={HttpUtility.UrlEncode(_serializer(pair.Value))}"); + } + } + } + stringBuilder.Append("&"); + } + } + return new Uri(stringBuilder.ToString().TrimEnd('&')); + } + } +} diff --git a/ZeroLevel/Services/Web/UrlUtility.cs b/ZeroLevel/Services/Web/UrlUtility.cs index b92d89f..87c8fff 100644 --- a/ZeroLevel/Services/Web/UrlUtility.cs +++ b/ZeroLevel/Services/Web/UrlUtility.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Linq; +using System.Reflection; using System.Text; using System.Text.RegularExpressions; @@ -522,6 +524,6 @@ namespace ZeroLevel.Services.Web i++; } return result; - } + } } } \ No newline at end of file