using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Net.Http.Json; using SimApi.Communications; using SimApi.Exceptions; namespace SimApi.Helpers; public class SimApiHttpClient(string? appId, string appKey) { public string Server { get; init; } = string.Empty; public string SignName { get; init; } = "sign"; public string TimestampName { get; init; } = "timestamp"; public string NonceName { get; init; } = "nonce"; public string? AppIdName { get; init; } = "appId"; public string[] SignFields { get; init; } = []; public T? SignQuery(string url, object? body = null, Dictionary? queries = null) { url = Server + url; var queryUrl = SignFields.Aggregate(string.Empty, (current, signField) => current + $"{signField}={queries?[signField]}&"); if (!string.IsNullOrEmpty(AppIdName)) { queryUrl += $"{AppIdName}={appId}&"; } queryUrl += $"{TimestampName}={(int)SimApiUtil.TimestampNow}&{NonceName}={Guid.NewGuid()}"; var signStr = $"{queryUrl}&{appKey}"; var path = $"{url}?{queryUrl}&{SignName}={SimApiUtil.Md5(signStr)}"; if (queries != null) { path = queries.Where(q => !SignFields.Contains(q.Key)) .Aggregate(path, (current, q) => current + $"&{q.Key}={q.Value}"); } return Query(path, body); } public T? AesQuery(string url, object body) { url = Server + url; if (!string.IsNullOrEmpty(AppIdName)) { url += $"?{AppIdName}={appId}"; } var req = new SimApiOneFieldRequest { Data = SimApiAesUtil.Encrypt(SimApiUtil.Json(body), appKey) }; return Query(url, req); } public T? AesSignQuery(string url, object body, Dictionary? queries = null) { var req = new SimApiOneFieldRequest { Data = SimApiAesUtil.Encrypt(SimApiUtil.Json(body), appKey) }; return SignQuery(url, req, queries); } private T? Query(string url, object? req) { var http = new HttpClient(); var resp = http.PostAsJsonAsync(url, req).Result; var res = resp.Content.ReadFromJsonAsync>().Result; if (res == null) { throw new SimApiException(500, "请求发生错误"); } return res.Code != 200 ? throw new SimApiException(res.Code, res.Message) : res.Data; } }