using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Security; using System.Reflection; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading.Tasks; namespace APT.Infrastructure.Core { public class ApiHelper { public static int URL_TIMEOUT = 60000 * 120;//2个小时 private static string ApiByGet(string url, IDictionary parameters, string token, IDictionary headParams) { HttpWebResponse response = HttpWebResponseUtility.CreateGetHttpResponseByParams(url, parameters, URL_TIMEOUT, "", null, token, headParams); var sr = new System.IO.StreamReader(response.GetResponseStream()); string content = sr.ReadToEnd(); //这里的content就是网页内容了 sr.Close(); return content; } private static string ApiByPost(string url, IDictionary parameters, string token, IDictionary headParams = null) { HttpWebResponse response = HttpWebResponseUtility.CreateApiPostHttpResponse(url, parameters, URL_TIMEOUT, "", Encoding.UTF8, null, token, headParams); var sr = new System.IO.StreamReader(response.GetResponseStream()); string content = sr.ReadToEnd(); //这里的content就是网页内容了 sr.Close(); return content; } private static string ApiSend(ApiBody body) { var response = HttpWebResponseUtility.CreatePostHttpResponseByJson(body.ApiUrl, body.SendObj != null ? JsonConvert.SerializeObject(body.SendObj) : string.Empty, URL_TIMEOUT, "", null, body.Token, body.HeadParams); if (response != null) { var sr = new System.IO.StreamReader(response.GetResponseStream()); string content = sr.ReadToEnd(); //这里的content就是网页内容了 sr.Close(); System.Diagnostics.Debug.WriteLine(content); return content; } else { return ""; } } public static byte[] ApiPicture(ApiBody body) { var response = HttpWebResponseUtility.CreatePostHttpResponseByJson(body.ApiUrl, body.SendObj != null ? JsonConvert.SerializeObject(body.SendObj) : string.Empty, URL_TIMEOUT, "", null, body.Token, body.HeadParams); if (response != null) { //获取HTTP返回数据 using (Stream sr = response.GetResponseStream()) { byte[] img = new byte[response.ContentLength]; sr.Read(img, 0, (int)response.ContentLength);//这里获取之后 sr.Close(); sr.Dispose(); return img; } response.Close(); } else { return null; } } public static T GetApiData(ApiBody body) { int totalCount = 0; var ret = GetApiData(body, ref totalCount); return ret; } public static T GetApiData(ApiBody body, ref int totalCount) { string msg = string.Empty; var ret = GetApiData(body, ref totalCount, ref msg); return ret; } public static string GetApiData(ApiBody body, ref string msg) { string returns = string.Empty; //参数 if (body.SendType == SendType.Get) { if (body.SendObj != null) body.Params = GetParameters(body.SendObj); returns = ApiByGet(body.ApiUrl, body.Params, body.Token, body.HeadParams); } else if (body.SendType == SendType.Post) { if (body.Params != null && body.Params.Any()) returns = ApiByPost(body.ApiUrl, body.Params, body.Token, body.HeadParams); else returns = ApiSend(body); } LoggerManager.GetLogger().Info($"请求接口:{body.ApiUrl},返回:{returns}"); if (!string.IsNullOrEmpty(returns)) { if (body.ResolvingResult) { return returns; } else { var s = Newtonsoft.Json.JsonConvert.DeserializeObject(returns); var obj = JObject.Parse(s.ToString()); var result = Convert.ToBoolean(obj["IsSuccessful"]); if (result) { return obj["Data"] == null ? "" : obj["Data"].ToString(); } else { if (obj["ErrorMessage"] != null) msg = obj["ErrorMessage"].ToString(); } } } return ""; } public static T GetApiData(ApiBody body, ref int totalCount, ref string msg) { string returns = string.Empty; //参数 if (body.SendType == SendType.Get) { if (body.SendObj != null) body.Params = GetParameters(body.SendObj); returns = ApiByGet(body.ApiUrl, body.Params, body.Token, body.HeadParams); } else if (body.SendType == SendType.Post) { if (body.Params != null && body.Params.Any()) returns = ApiByPost(body.ApiUrl, body.Params, body.Token, body.HeadParams); else returns = ApiSend(body); } LoggerManager.GetLogger().Info($"请求接口:{body.ApiUrl},返回:{returns}"); if (!string.IsNullOrEmpty(returns)) { if (body.ResolvingResult) { try { var t = JsonConvert.DeserializeObject(returns); return t; } catch (Exception ex) { return default(T); } } else { var s = Newtonsoft.Json.JsonConvert.DeserializeObject(returns); var obj = JObject.Parse(s.ToString()); var result = Convert.ToBoolean(obj["IsSuccessful"]); if (result) { if (obj["Data"].ToString() != "[]") { totalCount = obj["TotalCount"] == null ? 0 : Convert.ToInt32(obj["TotalCount"]); try { var t = JsonConvert.DeserializeObject(obj["Data"].ToString()); return t; } catch (Exception ex) { return default(T); } } } else { if (obj["ErrorMessage"] != null) msg = obj["ErrorMessage"].ToString(); } } } return default(T); } public static bool GetApiData(ApiBody body, ref int totalCount, ref string msg) { string returns = string.Empty; if (body.SendType == SendType.Get) { //参数 if (body.SendObj != null) body.Params = GetParameters(body.SendObj); returns = ApiByGet(body.ApiUrl, body.Params, body.Token, body.HeadParams); } else if (body.SendType == SendType.Post) { if (body.Params != null && body.Params.Any()) returns = ApiByPost(body.ApiUrl, body.Params, body.Token); else returns = ApiSend(body); } var result = false; if (!string.IsNullOrEmpty(returns)) { var s = Newtonsoft.Json.JsonConvert.DeserializeObject(returns); var obj = JObject.Parse(s.ToString()); result = Convert.ToBoolean(obj["IsSuccessful"]); if (result && obj["Data"].ToString() != "[]") { totalCount = obj["TotalCount"] == null ? 0 : Convert.ToInt32(obj["TotalCount"]); } if (obj["ErrorMessage"] != null) msg = obj["ErrorMessage"].ToString(); } return result; } public static bool GetApiData(ApiBody body, ref int totalCount) { string msg = string.Empty; return GetApiData(body, ref totalCount, ref msg); } public static IDictionary GetParameters(object obj) { IDictionary Params = new Dictionary(); if (obj != null) { var type = obj.GetType(); PropertyInfo[] properties = type.GetProperties().Where(p => !p.GetMethod.IsVirtual).ToArray(); foreach (PropertyInfo info in properties) { try { var value = GetObjectPropertyValue(obj, info.Name).ToString(); if (value == "APT.Infrastructure.Core.FilterGroup" || value.StartsWith("System.Collections.Generic.List")) { continue; } Params.Add(info.Name, value); } catch (Exception ex) { throw new Exception(ex.Message); } } } return Params; } public static IDictionary NewGetPrarams(object obj) { IDictionary Params = new Dictionary(); if (obj != null) { var type = obj.GetType(); PropertyInfo[] properties = type.GetProperties(); foreach (PropertyInfo info in properties) { try { Params.Add(info.Name, GetObjectPropertyValue(obj, info.Name)); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); } } } return Params; } public static object GetObjectPropertyValue(object obj, string propertyname) { var t = obj.GetType(); PropertyInfo property = t.GetProperty(propertyname); if (property == null) return string.Empty; object o = property.GetValue(obj, null); if (o == null) return string.Empty; return o; } } public class ApiBody { public ApiBody() { this.HeadParams = new Dictionary(); } public string ApiUrl { get; set; } public IDictionary Params { get; set; } public SendType SendType { get; set; } public Object SendObj { get; set; } public bool ResolvingResult { get; set; } public string Token { get; set; } public IDictionary HeadParams { get; set; } } public class PagedList : List, IEnumerable { public PagedList(IEnumerable currentPageItems, int pageIndex, int pageSize, int totalItemCount) { this.AddRange(currentPageItems); this.CurrentPageIndex = pageIndex; this.PageSize = pageSize; this.TotalPageCount = totalItemCount; } public int CurrentPageIndex { get; set; } public int PageSize { get; set; } public int TotalPageCount { get; } } public enum SendType { Get, Post, Put, Delete } public class HttpWebResponseUtility { private static readonly string DefaultUserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"; /// /// 创建GET方式的HTTP请求 /// /// 请求的URL /// 请求的超时时间 /// 请求的客户端浏览器信息,可以为空 /// 随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空 /// public static HttpWebResponse CreateGetHttpResponse(string url, int? timeout, string userAgent, CookieCollection cookies) { if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); } HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; request.Method = "GET"; request.UserAgent = DefaultUserAgent; if (!string.IsNullOrEmpty(userAgent)) { request.UserAgent = userAgent; } if (timeout.HasValue) { request.Timeout = timeout.Value; } if (cookies != null) { request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(cookies); } return request.GetResponse() as HttpWebResponse; } /// /// 创建GET方式的HTTP请求 /// /// 请求的URL /// 请求的超时时间 /// 请求的客户端浏览器信息,可以为空 /// 随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空 /// public static HttpWebResponse CreateGetHttpResponseByParams(string url, IDictionary parameters, int? timeout, string userAgent, CookieCollection cookies, string token, IDictionary headParams) { if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); } if (!(parameters == null || parameters.Count == 0)) { int i = 0; foreach (string key in parameters.Keys) { if (i > 0) { url += string.Format("&{0}={1}", key, parameters[key]); } else { url += string.Format("?{0}={1}", key, parameters[key]); } i++; } } HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; request.Method = "GET"; request.UserAgent = DefaultUserAgent; if (!string.IsNullOrEmpty(token)) request.Headers.Add("Authorization", "Bearer " + token); if (headParams != null && headParams.Any()) headParams.ForEach(t => { request.Headers.Add(t.Key, t.Value); }); if (!string.IsNullOrEmpty(userAgent)) { request.UserAgent = userAgent; } if (timeout.HasValue) { request.Timeout = timeout.Value; } if (cookies != null) { request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(cookies); } return request.GetResponse() as HttpWebResponse; } public static HttpWebResponse CreatePostHttpResponseByJson(string url, string json, int? timeout, string userAgent, CookieCollection cookies, string token, IDictionary headParams) { if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); } byte[] bytes = null; if (!string.IsNullOrEmpty(json)) bytes = Encoding.UTF8.GetBytes(json); HttpWebRequest request = null; //如果是发送HTTPS请求 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; } request.Method = "POST"; request.ContentType = "application/json"; if (!string.IsNullOrEmpty(token)) request.Headers.Add("Authorization", "Bearer " + token); if (headParams != null && headParams.Any()) headParams.ForEach(t => { request.Headers.Add(t.Key, t.Value); }); if (!string.IsNullOrEmpty(userAgent)) { request.UserAgent = userAgent; } else { request.UserAgent = DefaultUserAgent; } if (timeout.HasValue) { request.Timeout = timeout.Value; } if (cookies != null) { request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(cookies); } if (bytes != null) { using (Stream stream = request.GetRequestStream()) { stream.Write(bytes, 0, bytes.Length); } } return request.GetResponse() as HttpWebResponse; } /// /// 创建POST方式的HTTP请求 /// /// 请求的URL /// 随同请求POST的参数名称及参数值字典 /// 请求的超时时间 /// 请求的客户端浏览器信息,可以为空 /// 发送HTTP请求时所用的编码 /// 随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空 /// public static HttpWebResponse CreatePostHttpResponse(string url, IDictionary parameters, int? timeout, string userAgent, Encoding requestEncoding, CookieCollection cookies) { if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); } if (requestEncoding == null) { throw new ArgumentNullException("requestEncoding"); } HttpWebRequest request = null; //如果是发送HTTPS请求 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; } //request.Method = "POST"; //request.ContentType = "application/x-www-form-urlencoded"; request.Method = "GET"; //request.ContentType = "application/x-www-form-urlencoded"; if (!string.IsNullOrEmpty(userAgent)) { request.UserAgent = userAgent; } else { request.UserAgent = DefaultUserAgent; } if (timeout.HasValue) { request.Timeout = timeout.Value; } if (cookies != null) { request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(cookies); } //如果需要POST数据 if (!(parameters == null || parameters.Count == 0)) { StringBuilder buffer = new StringBuilder(); int i = 0; foreach (string key in parameters.Keys) { if (i > 0) { buffer.AppendFormat("&{0}={1}", key, parameters[key]); } else { buffer.AppendFormat("{0}={1}", key, parameters[key]); } i++; } byte[] data = requestEncoding.GetBytes(buffer.ToString()); using (Stream stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } } return request.GetResponse() as HttpWebResponse; } /// /// 创建POST方式的HTTP请求 /// /// 请求的URL /// 随同请求POST的参数名称及参数值字典 /// 请求的超时时间 /// 请求的客户端浏览器信息,可以为空 /// 发送HTTP请求时所用的编码 /// 随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空 /// public static HttpWebResponse CreateApiPostHttpResponse(string url, IDictionary parameters, int? timeout, string userAgent, Encoding requestEncoding, CookieCollection cookies, string token, IDictionary headParams = null) { if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); } if (requestEncoding == null) { throw new ArgumentNullException("requestEncoding"); } HttpWebRequest request = null; //如果是发送HTTPS请求 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; } request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; if (!string.IsNullOrEmpty(token)) request.Headers.Add("Authorization", "Bearer " + token); if (headParams != null) { foreach (var header in headParams) { request.Headers.Add(header.Key, header.Value); } } if (!string.IsNullOrEmpty(userAgent)) { request.UserAgent = userAgent; } else { request.UserAgent = DefaultUserAgent; } if (timeout.HasValue) { request.Timeout = timeout.Value; } if (cookies != null) { request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(cookies); } //如果需要POST数据 if (!(parameters == null || parameters.Count == 0)) { StringBuilder buffer = new StringBuilder(); int i = 0; foreach (string key in parameters.Keys) { if (i > 0) { buffer.AppendFormat("&{0}={1}", key, parameters[key]); } else { buffer.AppendFormat("{0}={1}", key, parameters[key]); } i++; } byte[] data = requestEncoding.GetBytes(buffer.ToString()); using (Stream stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } } return request.GetResponse() as HttpWebResponse; } public static async Task DoPostTask(string url, IDictionary paramsa) { var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip }; using (var http = new HttpClient(handler)) { var content = new FormUrlEncodedContent(paramsa); var response = await http.PostAsync(url, content); response.EnsureSuccessStatusCode(); return await response.Content.ReadAsStringAsync(); } } private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; //总是接受 } } }