using BS.Shared.Extensions; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Linq; using System.Net; using System.Security.Policy; using System.Text; using System.Threading.Tasks; namespace BeWo.Server.ApiFacade.Core { public class WebClientFacade { // // GET // protected TRes SendGet(string sub_url, string token = null) => Get(sub_url, token); protected Task SendGetAsync(string sub_url, string token = null) => GetAsync(sub_url, token); // // POST // protected TRes SendPostUploadString(string sub_url, TReq req, string token = null) => SendUploadString(sub_url, "POST", req, token); protected TRes SendPostUploadValues(string sub_url, TReq req, string token = null) => SendUploadValues(sub_url, "POST", req, token); protected byte[] SendPostUploadValuesRaw(string sub_url, TReq req, string token = null) => SendUploadValuesRaw(sub_url, "POST", req, token); protected Task SendPostUploadStringAsync(string sub_url, TReq req, string token = null) => SendUploadStringAsync(sub_url, "POST", req, token); protected Task SendPostUploadValuesAsync(string sub_url, TReq req, string token = null) => SendUploadValuesAsync(sub_url, "POST", req, token); protected Task SendPostUploadValuesAsyncRaw(string sub_url, TReq req, string token = null) => SendUploadValuesRawAsync(sub_url, "POST", req, token); #region private // // Requests // private TRes Get(string sub_url, string token = null) { var url = getUrl(sub_url); string response = Get(url, token); return deserialize(response); } private TRes SendUploadString(string sub_url, string method, TReq req, string token = null) { var data = serializeJson(req); var url = getUrl(sub_url); string response = SendUploadString(url, method, data, token); return deserialize(response); } private TRes SendUploadValues(string sub_url, string method, TReq req, string token = null) { var data = serialize(req); var url = getUrl(sub_url); string response = SendUploadValues(url, method, data, token); return deserialize(response); } private byte[] SendUploadValuesRaw(string sub_url, string method, TReq req, string token = null) { var data = serialize(req); var url = getUrl(sub_url); var response = SendUploadValuesRaww(url, method, data, token); return response; } private async Task GetAsync(string sub_url, string token = null) { var url = getUrl(sub_url); string response = await GetAsync(url, token); return deserialize(response); } private async Task SendUploadStringAsync(string sub_url, string method, TReq req, string token = null) { var data = serializeJson(req); var url = getUrl(sub_url); string response = await SendUploadStringAsync(url, method, data, token); return deserialize(response); } private async Task SendUploadValuesAsync(string sub_url, string method, TReq req, string token = null) { var data = serialize(req); var url = getUrl(sub_url); string response = await SendUploadValuesAsync(url, method, data, token); return deserialize(response); } private async Task SendUploadValuesRawAsync(string sub_url, string method, TReq req, string token = null) { var data = serialize(req); var url = getUrl(sub_url); var response = await SendUploadValuesRawAsync(url, method, data, token); return response; } // // String // private string Get(string url, string token = null) => exec(true, client => client.DownloadString(url), token); private string SendUploadString(string url, string method, string request, string token = null) => exec(false, client => client.UploadString(url, method, request), token); private string SendUploadValues(string url, string method, T request, string token = null) => exec(false, client => Encoding.UTF8.GetString(client.UploadValues(url, method, request?.ToNameValueCollection())), token); private byte[] SendUploadValuesRaww(string url, string method, T request, string token = null) => execraw(false, client => client.UploadValues(url, method, request?.ToNameValueCollection()), token); private Task GetAsync(string url, string token = null) => execasync(true, client => client.DownloadStringTaskAsync(url), token); private Task SendUploadStringAsync(string url, string method, string request, string token = null) => execasync(false, client => client.UploadStringTaskAsync(url, method, request), token); private Task SendUploadValuesAsync(string url, string method, T request, string token = null) => execasync(false, async client => Encoding.UTF8.GetString(await client.UploadValuesTaskAsync(url, method, request?.ToNameValueCollection()).ConfigureAwait(false)), token); private Task SendUploadValuesRawAsync(string url, string method, T request, string token = null) => execasyncraw(false, async client => await client.UploadValuesTaskAsync(url, method, request?.ToNameValueCollection()).ConfigureAwait(false), token); // // Base // private string exec(bool override_header, Func action, string token = null) { string response; using (WebClient client = new WebClient()) { //client.Encoding = Encoding.Default; client.Encoding = Encoding.UTF8; if (override_header) client.Headers.Add(HttpRequestHeader.ContentType, "application/json"); if (token != null) client.Headers.Set(HttpRequestHeader.Authorization, "Bearer " + token); response = action(client); } return response; } private byte[] execraw(bool override_header, Func action, string token = null) { byte[] response; using (WebClient client = new WebClient()) { //client.Encoding = Encoding.Default; client.Encoding = Encoding.UTF8; if (override_header) client.Headers.Add(HttpRequestHeader.ContentType, "application/json"); if (token != null) client.Headers.Set(HttpRequestHeader.Authorization, "Bearer " + token); response = action(client); } return response; } private async Task execasync(bool override_header, Func> action, string token = null) { string response; using (WebClient client = new WebClient()) { //client.Encoding = Encoding.Default; client.Encoding = Encoding.UTF8; if (override_header) client.Headers.Add(HttpRequestHeader.ContentType, "application/json"); if (token != null) client.Headers.Set(HttpRequestHeader.Authorization, "Bearer " + token); response = await action(client); } return response; } private async Task execasyncraw(bool override_header, Func> action, string token = null) { byte[] response; using (WebClient client = new WebClient()) { //client.Encoding = Encoding.Default; client.Encoding = Encoding.UTF8; if (override_header) client.Headers.Add(HttpRequestHeader.ContentType, "application/json"); if (token != null) client.Headers.Set(HttpRequestHeader.Authorization, "Bearer " + token); response = await action(client); } return response; } private T deserialize(string input) { if (string.IsNullOrEmpty(input)) return default; if (typeof(T) == typeof(string)) return (T)(object)input; if (typeof(T) == typeof(byte[])) return (T)(object)Encoding.UTF8.GetBytes(input); var t = JsonConvert.DeserializeObject(input); return t; } private IDictionary serialize(T input) { return input?.ToKeyValue(); } private string serializeJson(T input) { if (typeof(T) == typeof(string)) return input as string; var t = JsonConvert.SerializeObject(input); return t; } #endregion protected virtual string getKey() { return null; } protected virtual string getUrl() { return null; } private string getUrl(string sub_url) { var root = getUrl(); var baseUri = new Uri(root); var uri = new Uri(baseUri, sub_url); var url = uri.ToString(); return url; } } }