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; }
}
}