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<string> GetAsync(string url, Dictionary<string, object> 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<string, (int Count, DateTime LastRequestTime)> requestTracker = new();
|
// 封装一个用HttpClient发送Post请求的方法有参数
|
public static async Task<string> PostAsync(string url, Dictionary<string, object> 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<string, object> 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("<?xml");
|
string innerXml = xmlContent.Substring(startIndex);
|
// 去除外层多余的内容(假设外层只有 <string> 相关内容)
|
innerXml = Regex.Replace(innerXml, @"^.*?<ROOT>", "<ROOT>");
|
|
// 去除内层 XML 声明
|
innerXml = innerXml.Replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>", "");
|
innerXml = innerXml.Replace("<string xmlns=\"http://tempuri.org/\">", "");
|
|
innerXml = innerXml.Replace("<?xml version=\"1.0\" encoding=\"GB2312\"?>", "");
|
// 处理转义字符
|
innerXml = innerXml.Replace("<", "<");
|
innerXml = innerXml.Replace(">", ">");
|
innerXml = innerXml.Replace("</string>", "");
|
|
innerXml = innerXml.Replace("<?xml version=\"1.0\" encoding=\"GB2312\"?>", "");
|
|
//innerXml = innerXml.Replace("<ROOT>", "");
|
//innerXml = innerXml.Replace("</ROOT>", "");
|
|
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("<?xml");
|
string innerXml = xmlContent.Substring(startIndex);
|
// 去除外层多余的内容(假设外层只有 <string> 相关内容)
|
innerXml = Regex.Replace(innerXml, @"^.*?<ROOT>", "<ROOT>");
|
|
// 去除内层 XML 声明
|
innerXml = innerXml.Replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>", "");
|
innerXml = innerXml.Replace("<string xmlns=\"http://tempuri.org/\">", "");
|
|
innerXml = innerXml.Replace("<?xml version=\"1.0\" encoding=\"GB2312\"?>", "");
|
// 处理转义字符
|
innerXml = innerXml.Replace("<", "<");
|
innerXml = innerXml.Replace(">", ">");
|
innerXml = innerXml.Replace("</string>", "");
|
|
innerXml = innerXml.Replace("<?xml version=\"1.0\" encoding=\"GB2312\"?>", "");
|
|
//innerXml = innerXml.Replace("<ROOT>", "");
|
//innerXml = innerXml.Replace("</ROOT>", "");
|
|
XmlDocument xmlDoc = new XmlDocument();
|
xmlDoc.LoadXml(innerXml);
|
|
return xmlDoc.InnerXml;
|
//return xmlContent;
|
}
|
|
|
private static void LogRequestParameters(Dictionary<string, object> 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<KeyValuePair<string, string>> ConvertToKeyValuePairs(Dictionary<string, object> parameters)
|
{
|
foreach (var kvp in parameters)
|
{
|
yield return new KeyValuePair<string, string>(kvp.Key, kvp.Value?.ToString());
|
}
|
}
|
|
}
|