using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Text; using System.Threading.Tasks; using System.Windows.Controls; using System.Windows.Input; using WCS.Model; using WCS.Model.ApiModel.MXBackgroundThread; namespace 货架标准上位机.Api { public static class ApiHelp { public static HttpClient httpClient; static ApiHelp() { httpClient = new HttpClient(); httpClient.Timeout = TimeSpan.FromSeconds(10); httpClient.DefaultRequestHeaders.Add("UserModel-Agent", "Chrome/95.0.4638.69 Safari/537.36"); ServicePointManager.Expect100Continue = false; } public static async Task Get(string uri, object? query = null, object? body = null) { return await Send(HttpMethod.Get, uri, query, body); } public static async Task Get(IEnumerable uri, object? query = null, object? body = null) { return await Send(HttpMethod.Get, uri, query, body); } public static async Task Get(string uri, object? query = null, object? body = null) { return await Send(HttpMethod.Get, uri, query, body); } public static async Task Get(IEnumerable uri, object? query = null, object? body = null) { return await Send(HttpMethod.Get, uri, query, body); } public static async Task Post(string uri, object? body = null, object? query = null) { return await Send(HttpMethod.Post, uri, query, body); } public static async Task Post(IEnumerable uri, object? body = null, object? query = null) { return await Send(HttpMethod.Post, uri, query, body); } public static async Task Post(string uri, object? body = null, object? query = null) { return await Send(HttpMethod.Post, uri, query, body); } public static async Task Post(IEnumerable uri, object? body = null, object? query = null) { return await Send(HttpMethod.Post, uri, query, body); } public static async Task Send(HttpMethod method, string uri, object? query = null, object? body = null) { return await Send(method, new string[] { uri }, query, body); } public static async Task Send(HttpMethod method, IEnumerable uri, object? query = null, object? body = null) { HttpRequestMessage httpRequestMessage = new HttpRequestMessage(method, "".AppendPathSegments(uri).SetQueryParams(query)); if (body != null) { var content = new StringContent(JsonConvert.SerializeObject(body), Encoding.UTF8, "application/json"); httpRequestMessage.Content = content; } var re = await httpClient.SendAsync(httpRequestMessage); if (!re.IsSuccessStatusCode) return new ResponseBase() { Code = (int)re.StatusCode }; var con = await re.Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject(con) ?? new ResponseBase(); } public static async Task Send(HttpMethod method, string uri, object? query = null, object? body = null) { return await Send(method, new string[] { uri }, query, body); } public static async Task Send(HttpMethod method, IEnumerable uri, object? query = null, object? body = null) { try { var url = "".AppendPathSegments(uri).SetQueryParams(query); HttpRequestMessage httpRequestMessage = new HttpRequestMessage(method, url); if (body != null) { var content = new StringContent(JsonConvert.SerializeObject(body), Encoding.UTF8, "application/json"); httpRequestMessage.Content = content; } var re = await httpClient.SendAsync(httpRequestMessage); if (!re.IsSuccessStatusCode) return default(T); var con = await re.Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject(con) ?? default(T); ; } catch (Exception ex) { return default(T); } } /// /// 追加路径片段(有更高要求可以使用Flurl库) /// /// 地址,如 https://www.baidu.com /// 路径片段 /// 地址 public static string AppendPathSegments(this string url, IEnumerable segments) { string urlStr = url.Trim(); foreach (var segment in segments) { var val = segment?.ToString()?.Trim() ?? ""; if (string.IsNullOrWhiteSpace(val)) continue; if (urlStr.EndsWith("/")) urlStr = urlStr.Substring(0, urlStr.Length - 1); if (val.Length > 0) urlStr += string.IsNullOrEmpty(urlStr) || val.StartsWith("/") ? val : $"/{val}"; } return urlStr; } /// /// 设置Query参数(有更高要求可以使用Flurl库) /// /// 地址,如 https://www.baidu.com/s /// 参数,支持字典和对象 /// 地址 public static string SetQueryParams(this string url, object? values) { string urlStr = url; if (values == null) return urlStr; List kv = new List(); 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.Contains("?")) urlStr += "?"; else { if (!urlStr.EndsWith("&")) urlStr += "&"; } urlStr += string.Join("&", kv); } return urlStr; } /// /// Post方式下载Excel文件 /// /// 文件保存的路径 /// /// /// /// public static async Task PostDownloadFileAsync(string localFilePath, HttpMethod method, string requestUrl, object? body = null) { HttpRequestMessage httpRequestMessage = new HttpRequestMessage(method, requestUrl); if (body != null) { var content = new StringContent(JsonConvert.SerializeObject(body), Encoding.UTF8, "application/json"); httpRequestMessage.Content = content; } using (var response = await httpClient.SendAsync(httpRequestMessage)) { response.EnsureSuccessStatusCode(); // 确保请求成功 // 获取内容头中的文件名(如果需要的话) //var contentDisposition = ContentDispositionHeaderValue.Parse(response.Content.Headers.ContentDisposition.ToString()); //string filename = contentDisposition.FileName.Trim('"'); // 去除引号 var filename = string.Empty; // 如果提供的本地文件路径没有文件名,则使用从响应头中获取的文件名 if (Path.GetFileName(localFilePath) == string.Empty) { localFilePath = Path.Combine(Path.GetDirectoryName(localFilePath), filename); } // 写入文件 using (var fileStream = new FileStream(localFilePath, FileMode.Create, FileAccess.Write, FileShare.None, bufferSize: 4096, useAsync: true)) { await response.Content.CopyToAsync(fileStream); } } } /// /// Post方式导入Excel文件 /// /// 文件保存的路径 /// /// /// /// public static async Task PostImportFileAsync(string localFilePath, HttpMethod method, string requestUrl, string userName, string deviceType) { HttpRequestMessage httpRequestMessage = new HttpRequestMessage(method, requestUrl); using (var content = new MultipartFormDataContent()) { var fileContent = new StreamContent(new FileStream(localFilePath, FileMode.Open, FileAccess.Read)); fileContent.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("multipart/form-data"); content.Add(fileContent, "excelFile", Path.GetFileName(localFilePath)); var userNameContent = new StringContent(userName); userNameContent.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("multipart/form-data"); content.Add(userNameContent, "userName"); var deviceTypeContent = new StringContent(deviceType); deviceTypeContent.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("multipart/form-data"); content.Add(deviceTypeContent, "deviceType"); httpRequestMessage.Content = content; using (var response = await httpClient.SendAsync(httpRequestMessage)) { response.EnsureSuccessStatusCode(); // 确保请求成功 var filename = string.Empty; if (!response.IsSuccessStatusCode) return default(T); var con = await response.Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject(con) ?? default(T); ; } } } /// /// 调用接口超时时间10s /// /// /// /// /// /// /// public static T GetDataFromHttp(string url, object dataObj, string httpMethod, bool isSaveLog = false) { Guid guid = Guid.NewGuid(); var data = dataObj == null ? string.Empty : JsonConvert.SerializeObject(dataObj); try { if (isSaveLog) Logs.Write($"【{guid}】开始请求调用接口 url:{url} 请求方式:{httpMethod} 数据:{data}", LogsType.Api); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = httpMethod; request.ContentType = "application/json"; request.Timeout = 10000; if (!string.IsNullOrEmpty(data)) { string strContent = data; //参数data using (StreamWriter dataStream = new StreamWriter(request.GetRequestStream())) { dataStream.Write(strContent); dataStream.Close(); } } HttpWebResponse response = (HttpWebResponse)request.GetResponse(); string encoding = response.ContentEncoding; if (encoding == null || encoding.Length < 1) { encoding = "UTF-8"; //默认编码 } StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(encoding)); string retString = reader.ReadToEnd(); if (isSaveLog) Logs.Write($"【{guid}】请求调用接口结束 返回数据为{retString}", LogsType.Api); return JsonConvert.DeserializeObject(retString); } catch (Exception ex) { Logs.Write($"【{guid}】请求调用遇到异常 异常信息为{ex.Message}"); return default(T); } } /// /// 调用接口-长延时(MX MES接口返回时间偶尔10秒+为保证业务能正常进行所以增加此接口) /// /// /// /// /// /// /// public static ApiResult MXGetDataFromHttpLongWait(string data, string url, string httpMethod, bool isSaveLog = false) { Guid guid = Guid.NewGuid(); try { if (isSaveLog) Logs.Write($"【{guid}】开始请求调用接口 url:{url} 请求方式:{httpMethod} 数据:{data}"); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = httpMethod; request.ContentType = "application/json"; request.Timeout = 20000; if (!string.IsNullOrEmpty(data)) { string strContent = data; //参数data using (StreamWriter dataStream = new StreamWriter(request.GetRequestStream())) { dataStream.Write(strContent); dataStream.Close(); } } HttpWebResponse response = (HttpWebResponse)request.GetResponse(); string encoding = response.ContentEncoding; if (encoding == null || encoding.Length < 1) { encoding = "UTF-8"; //默认编码 } StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(encoding)); string retString = reader.ReadToEnd(); if (isSaveLog) Logs.Write($"【{guid}】请求调用接口结束 返回数据为{retString}"); return JsonConvert.DeserializeObject>(retString); } catch (Exception ex) { Logs.Write($"【{guid}】请求调用遇到异常 异常信息为{ex.Message}"); return new ApiResult() { code = 500, message = ex.Message, }; } } public static ApiResult MXGetDataFromHttp(string data, string url, string httpMethod, bool isSaveLog = false) { Guid guid = Guid.NewGuid(); try { if (isSaveLog) Logs.Write($"【{guid}】开始请求调用接口 url:{url} 请求方式:{httpMethod} 数据:{data}"); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = httpMethod; request.ContentType = "application/json"; request.Timeout = 8000; if (!string.IsNullOrEmpty(data)) { string strContent = data; //参数data using (StreamWriter dataStream = new StreamWriter(request.GetRequestStream())) { dataStream.Write(strContent); dataStream.Close(); } } HttpWebResponse response = (HttpWebResponse)request.GetResponse(); string encoding = response.ContentEncoding; if (encoding == null || encoding.Length < 1) { encoding = "UTF-8"; //默认编码 } StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(encoding)); string retString = reader.ReadToEnd(); if (isSaveLog) Logs.Write($"【{guid}】请求调用接口结束 返回数据为{retString}"); return JsonConvert.DeserializeObject>(retString); } catch (Exception ex) { Logs.Write($"【{guid}】请求调用遇到异常 异常信息为{ex.Message}"); return new ApiResult() { code = 500, message = ex.Message, }; } } } }