using LogLibrary.Log; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Xml; using WIDESEA.Common; using Formatting = System.Xml.Formatting; namespace WIDESEA_Common; public class HttpsClient { private static readonly LogFactory LogFactory = new LogFactory(); // 封装一个用HttpClient发送GET请求的方法有参数 public static async Task GetAsync(string url, Dictionary parameters) { // 记录请求参数 LogRequestParameters(parameters, url); // 将参数拼接到URL中 string queryString = string.Join("&", parameters.Select(x => $"{x.Key}={x.Value}")); url += "?" + queryString; // 创建HttpClient实例 using (HttpClient client = new HttpClient()) { // 发送GET请求并获取响应 HttpResponseMessage response = await client.GetAsync(url); // 确保响应成功 response.EnsureSuccessStatusCode(); // 读取响应内容 string responseBody = await response.Content.ReadAsStringAsync(); // 记录响应参数 LogResponseParameters(responseBody, url); // 返回响应内容 return responseBody; } } // 用于追踪每个请求的调用次数和最后请求时间。 private static readonly Dictionary requestTracker = new(); // 封装一个用HttpClient发送Post请求的方法有参数 public static async Task PostAsync(string url, Dictionary parameters) { // 创建一个新的字典,排除 RequestTime 和 SessionId var filteredParameters = parameters.Where(p => p.Key != "RequestTime" && p.Key != "SessionId").ToDictionary(p => p.Key, p => p.Value); string requestKey = $"{url}:{JsonConvert.SerializeObject(filteredParameters)}"; // 检查请求次数和时间限制 if (requestTracker.TryGetValue(requestKey, out var requestInfo)) { if (requestInfo.Count >= 5 && DateTime.Now < requestInfo.LastRequestTime.AddMinutes(10)) { // 如果请求次数超过限制且未超过10分钟,抛出异常 throw new InvalidOperationException("请求次数已达到限制,请稍后再试。"); } } // 更新请求跟踪信息 if (requestTracker.ContainsKey(requestKey)) { requestTracker[requestKey] = (requestInfo.Count + 1, DateTime.Now); } else { requestTracker[requestKey] = (1, DateTime.Now); } // 记录请求参数 LogRequestParameters(parameters, url); // 创建HttpClient实例 using (HttpClient client = new HttpClient()) { // 将参数转换为FormUrlEncodedContent //string content = JsonConvert.SerializeObject(parameters); var content = new FormUrlEncodedContent(ConvertToKeyValuePairs(parameters)); //client.Timeout = TimeSpan.from; var request = new HttpRequestMessage(HttpMethod.Post, url); request.Content = content; //request.Content = new StringContent(content, Encoding.UTF8, "application/json"); //// 发送POST请求并获取响应 //HttpResponseMessage response = await client.PostAsync(url, content); HttpResponseMessage response = await client.SendAsync(request); // 确保响应成功 response.EnsureSuccessStatusCode(); // 读取响应内容 string responseBody = await response.Content.ReadAsStringAsync(); // 记录响应参数 LogResponseParameters(responseBody, url); // 返回响应内容 return responseBody; } } // 封装一个用HttpClient发送Post请求的方法有参数 public static string Post(string url) { // 记录请求参数 //LogRequestParameters(null, url); // 创建HttpClient实例 using (HttpClient client = new HttpClient()) { // 将参数转换为FormUrlEncodedContent //string content = JsonConvert.SerializeObject(parameters); //var content = new FormUrlEncodedContent(ConvertToKeyValuePairs(parameters)); //client.Timeout = TimeSpan.from; var request = new HttpRequestMessage(HttpMethod.Post, url); //request.Content = content; //request.Content = new StringContent(content, Encoding.UTF8, "application/json"); //// 发送POST请求并获取响应 //HttpResponseMessage response = await client.PostAsync(url, content); HttpResponseMessage response = client.Send(request); // 确保响应成功 response.EnsureSuccessStatusCode(); // 读取响应内容 Stream stream = response.Content.ReadAsStream(); StreamReader streamReader = new StreamReader(stream); string webResponse = streamReader.ReadToEnd(); // 记录响应参数 LogResponseParameters(webResponse, url); // 返回响应内容 return webResponse; } } public static string PostXml(string url, Dictionary parameters) { // 记录请求参数 LogRequestParameters(parameters, url); // 创建HttpClient实例 using (HttpClient client = new HttpClient()) { // 将参数转换为FormUrlEncodedContent //string content = JsonConvert.SerializeObject(parameters); var content = new FormUrlEncodedContent(ConvertToKeyValuePairs(parameters)); //十秒超时 client.Timeout = new TimeSpan(0, 0, 10); var request = new HttpRequestMessage(HttpMethod.Post, url); request.Content = content; //request.Content = new StringContent(content, Encoding.UTF8, "application/json"); //// 发送POST请求并获取响应 //HttpResponseMessage response = await client.PostAsync(url, content); HttpResponseMessage response = client.Send(request); // 确保响应成功 response.EnsureSuccessStatusCode(); //string xmlContent = await response.Content.ReadAsStringAsync(); // 读取响应内容 Stream stream = response.Content.ReadAsStream(); StreamReader streamReader = new StreamReader(stream); string respon = streamReader.ReadToEnd(); //string webResponse = XmlToJson(respon); string webResponse = ReplaceXmlStyle(respon); // 读取响应内容 //Stream stream = response.Content.ReadAsStream(); //StreamReader streamReader = new StreamReader(stream); //string webResponse = streamReader.ReadToEnd(); // 记录响应参数 LogResponseParameters(webResponse, url); // 返回响应内容 return webResponse; } } static string XmlToJson(string xmlContent) { // 提取内层 XML 内容 int startIndex = xmlContent.IndexOf(" 相关内容) innerXml = Regex.Replace(innerXml, @"^.*?", ""); // 去除内层 XML 声明 innerXml = innerXml.Replace("", ""); innerXml = innerXml.Replace("", ""); innerXml = innerXml.Replace("", ""); // 处理转义字符 innerXml = innerXml.Replace("<", "<"); innerXml = innerXml.Replace(">", ">"); innerXml = innerXml.Replace("", ""); innerXml = innerXml.Replace("", ""); //innerXml = innerXml.Replace("", ""); //innerXml = innerXml.Replace("", ""); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(innerXml); // 将XML转换为JSON string json = JsonConvert.SerializeXmlNode(xmlDoc); return json; } static string ReplaceXmlStyle(string xmlContent) { // 提取内层 XML 内容 int startIndex = xmlContent.IndexOf(" 相关内容) innerXml = Regex.Replace(innerXml, @"^.*?", ""); // 去除内层 XML 声明 innerXml = innerXml.Replace("", ""); innerXml = innerXml.Replace("", ""); innerXml = innerXml.Replace("", ""); // 处理转义字符 innerXml = innerXml.Replace("<", "<"); innerXml = innerXml.Replace(">", ">"); innerXml = innerXml.Replace("", ""); innerXml = innerXml.Replace("", ""); //innerXml = innerXml.Replace("", ""); //innerXml = innerXml.Replace("", ""); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(innerXml); return xmlDoc.InnerXml; //return xmlContent; } private static void LogRequestParameters(Dictionary parameters, string url = "") { StringBuilder builder = new StringBuilder(); builder.Append(Environment.NewLine); builder.Append("---------------------------------------------"); builder.Append(Environment.NewLine); builder.Append("url:" + url + "请求参数: " + JsonConvert.SerializeObject(parameters)); LogFactory.GetLog("API接口").Info(true, builder); } private static void LogResponseParameters(string responseBody, string url = "") { StringBuilder builder = new StringBuilder(); builder.Append(Environment.NewLine); builder.Append("url:" + url + "响应参数: " + responseBody); builder.Append(Environment.NewLine); builder.Append("---------------------------------------------"); builder.Append(Environment.NewLine); LogFactory.GetLog("API接口").Info(true, builder); } private static IEnumerable> ConvertToKeyValuePairs(Dictionary parameters) { foreach (var kvp in parameters) { yield return new KeyValuePair(kvp.Key, kvp.Value?.ToString()); } } }