using Newtonsoft.Json; using System; using System.Collections.Generic; 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, 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(data.ToString(), 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 content; } } /// /// 获取 OCV 数据 /// /// 请求地址 /// 仓库代码 /// 客户代码 /// 序列号列表 /// public static async Task GetOcvListAsync(string url, string warehouseCode, string customerCode, List stdSnList) { var request = new { warehouseCode = warehouseCode, customerCode = customerCode, stdSnList = stdSnList }; return await SendRequestStringAsync(url, HttpMethod.Post, request, true); } /// /// 上传检测结果 /// /// 请求地址 /// 检测请求数据 /// public static async Task UploadInspectionResultAsync(string url, InspectionRequest request) { return await SendRequestAsync(url, HttpMethod.Post, request, true); } } /// /// Token 响应模型 /// public class TokenResponse { public bool Success { get; set; } public string Token { get; set; } public int Expire { get; set; } } /// /// 检测请求模型 /// public class InspectionRequest { public string WarehouseCode { get; set; } public string CustomerCode { get; set; } public List SnList { get; set; } } /// /// 检测响应模型 /// public class InspectionResponse { public bool Success { get; set; } public string Message { get; set; } } }