using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Net.Http.Json; using SimApi.Communications; namespace SimApi.Helpers; public class SimApiHttpClient(string? appId, string appKey) { 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, Dictionary? queries = null) { 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}"); } var http = new HttpClient(); var resp = http.PostAsJsonAsync(path, body).Result; return resp.Content.ReadFromJsonAsync().Result; } public T? AesQuery(string url, object body) { if (!string.IsNullOrEmpty(AppIdName)) { url += $"?{AppIdName}={appId}"; } var req = new SimApiOneFieldRequest { Data = SimApiAesUtil.Encrypt(SimApiUtil.Json(body), appKey) }; var http = new HttpClient(); var resp = http.PostAsJsonAsync(url, req).Result; return resp.Content.ReadFromJsonAsync().Result; } 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); } }