using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; namespace JinYuan.MES { public static class MESApiHelper { private static readonly HttpClient _httpClient; private static string _appId; private static string _appKey; private static string _token; private static DateTime _tokenExpireTime; private const string TOKEN_URL = "https://example.com/api/oauth/token"; // Token 获取地址 static MESApiHelper() { _httpClient = new HttpClient(); _httpClient.Timeout = TimeSpan.FromSeconds(10); // 设置默认超时 } /// /// 初始化 AppId 和 AppKey /// /// /// public static void Initialize(string appId, string appKey) { _appId = appId; _appKey = appKey; } /// /// 确保 Token 有效 /// private static async Task EnsureTokenValidAsync() { if (string.IsNullOrEmpty(_token) || DateTime.Now >= _tokenExpireTime) { await RefreshTokenAsync(); } } /// /// 刷新 Token /// private static async Task RefreshTokenAsync() { var tokenRequest = new { appId = _appId, appKey = _appKey }; var response = await SendRequestAsync(TOKEN_URL, HttpMethod.Post, tokenRequest, false); if (response != null && response.Success) { _token = response.Token; _tokenExpireTime = DateTime.Now.AddSeconds(response.Expire); } else { throw new Exception("获取 Token 失败"); } } /// /// 发送 HTTP 请求 /// /// 返回类型 /// 请求地址 /// HTTP 方法 /// 请求数据 /// 是否需要认证 /// public static async Task SendRequestAsync(string url, HttpMethod method, object data = null, bool requiresAuth = true) { if (requiresAuth) { await EnsureTokenValidAsync(); } using (var request = new HttpRequestMessage(method, url)) { if (requiresAuth) { request.Headers.Add("Authorization", $"Bearer {_token}"); } if (data != null) { var json = JsonConvert.SerializeObject(data); request.Content = new StringContent(json, Encoding.UTF8, "application/json"); } var response = await _httpClient.SendAsync(request); var content = await response.Content.ReadAsStringAsync(); if (!response.IsSuccessStatusCode) { throw new HttpRequestException($"请求失败: {response.StatusCode}, {content}"); } return JsonConvert.DeserializeObject(content); } } /// /// 发送 HTTP 请求并返回字符串 /// /// 请求地址 /// HTTP 方法 /// 请求数据 /// 是否需要认证 /// public static async Task SendRequestStringAsync(string url, HttpMethod method, string data = null, bool requiresAuth = true) { if (requiresAuth) { await EnsureTokenValidAsync(); } using (var request = new HttpRequestMessage(method, url)) { if (requiresAuth) { request.Headers.Add("Authorization", $"Bearer {_token}"); } if (data != null) { if (method == HttpMethod.Get) { //// GET 请求 //var query = QueryStringBuilder(data); url = url + "/" + data; request.RequestUri = new Uri(url); } else { request.Content = new StringContent(data, Encoding.UTF8, "application/json"); } } try { var response = await _httpClient.SendAsync(request); var content = await response.Content.ReadAsStringAsync(); if (!response.IsSuccessStatusCode) { throw new HttpRequestException($"请求失败: {response.StatusCode}, {content}"); } return content; } catch (TaskCanceledException ex) { Debug.WriteLine($"【超时异常】请求被取消: {ex.Message},通常是服务端无响应/超时"); throw; } catch (Exception ex) { Debug.WriteLine($"【请求异常】{ex.Message}"); throw; } } } private static string QueryStringBuilder(object obj) { var properties = obj.GetType().GetProperties(); var keyValuePairs = properties .Where(p => p.GetValue(obj) != null) .Select(p => $"{Uri.EscapeDataString(p.Name)}={Uri.EscapeDataString(p.GetValue(obj).ToString())}"); return string.Join("&", keyValuePairs); } } /// /// Token 响应模型 /// public class TokenResponse { public bool Success { get; set; } public string Token { get; set; } public int Expire { get; set; } } }