|
|
@@ -0,0 +1,188 @@
|
|
|
+using System.Net;
|
|
|
+using YSAI.Core.data;
|
|
|
+using YSAI.Core.@interface;
|
|
|
+using static YSAI.Core.http.HttpData;
|
|
|
+
|
|
|
+namespace YSAI.Core.http
|
|
|
+{
|
|
|
+ /// <summary>
|
|
|
+ /// HTTP操作
|
|
|
+ /// </summary>
|
|
|
+ public class HttpOperate : IBaseAbstract, IDisposable
|
|
|
+ {
|
|
|
+ protected override string LogHead => "[ HttpOperate 操作 ]";
|
|
|
+ protected override string ClassName => "HttpOperate";
|
|
|
+ private static readonly object Lock = new object(); //锁
|
|
|
+ private static List<HttpOperate> ThisObjList = new List<HttpOperate>(); //自身对象集合
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 单例模式
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static HttpOperate Instance(HttpData.Basics basics)
|
|
|
+ {
|
|
|
+ HttpOperate? exp = ThisObjList.FirstOrDefault(c => c.basics.Equals(basics));
|
|
|
+ if (exp == null)
|
|
|
+ {
|
|
|
+ lock (Lock)
|
|
|
+ {
|
|
|
+ if (ThisObjList.Count(c => c.basics.Equals(basics)) > 0)
|
|
|
+ {
|
|
|
+ return ThisObjList.First(c => c.basics.Equals(basics));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ HttpOperate exp2 = new HttpOperate(basics);
|
|
|
+ ThisObjList.Add(exp2);
|
|
|
+ return exp2;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return exp;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 构造函数
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="basics"></param>
|
|
|
+ public HttpOperate(HttpData.Basics basics)
|
|
|
+ {
|
|
|
+ this.basics = basics;
|
|
|
+ }
|
|
|
+
|
|
|
+ public HttpOperate()
|
|
|
+ {
|
|
|
+ this.basics = new HttpData.Basics();
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 基础数据
|
|
|
+ /// </summary>
|
|
|
+ private HttpData.Basics basics { get; set; }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 请求
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="Body">参数</param>
|
|
|
+ /// <param name="encoding">编码格式</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public OperateResult Request(RequestData requestData)
|
|
|
+ {
|
|
|
+ Depart("Request");
|
|
|
+ try
|
|
|
+ {
|
|
|
+ bool UseProxy = requestData.Proxy == null ? false : true;
|
|
|
+ bool UseCookies = requestData.CookieContainer.Count > 0 ? true : false;
|
|
|
+ using (HttpClientHandler httpClientHandler = new HttpClientHandler { UseCookies = UseCookies, CookieContainer = requestData.CookieContainer, UseProxy = UseProxy, Proxy = requestData.Proxy, MaxConnectionsPerServer = basics.MaxConnectCount })
|
|
|
+ using (HttpClient httpClient = new HttpClient(httpClientHandler))
|
|
|
+ {
|
|
|
+ //设置超时时间
|
|
|
+ httpClient.Timeout = requestData.TimeOut;
|
|
|
+
|
|
|
+ //实例化对象,设置请求数据
|
|
|
+ HttpRequestMessage request = new HttpRequestMessage(requestData.Method, requestData.Url);
|
|
|
+
|
|
|
+ //设置请求头
|
|
|
+ if (requestData.Headers != null)
|
|
|
+ {
|
|
|
+ foreach (var item in requestData.Headers)
|
|
|
+ {
|
|
|
+ request.Headers.Add(item.Key, item.Value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //内容赋值
|
|
|
+ switch (requestData.cType)
|
|
|
+ {
|
|
|
+ case RequestData.CType.FormData:
|
|
|
+ MultipartFormDataContent multipartFormDataContent = new MultipartFormDataContent();
|
|
|
+ if (requestData.FormDatas != null)
|
|
|
+ {
|
|
|
+ foreach (var item in requestData.FormDatas)
|
|
|
+ {
|
|
|
+ multipartFormDataContent.Add(new StringContent(item.Value), item.Key);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (multipartFormDataContent != null && multipartFormDataContent.Count() > 0)
|
|
|
+ {
|
|
|
+ multipartFormDataContent.Headers.ContentType.MediaType = requestData.ContentType;
|
|
|
+ request.Content = multipartFormDataContent;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case RequestData.CType.Raw:
|
|
|
+ //设置请求参数
|
|
|
+ if (!string.IsNullOrEmpty(requestData.Content))
|
|
|
+ {
|
|
|
+ request.Content = new StringContent(requestData.Content, requestData.Encoding, requestData.ContentType); //设置post请求参数
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ //数据发送
|
|
|
+ HttpResponseMessage response = httpClient.Send(request);
|
|
|
+ //获取响应流
|
|
|
+ StreamReader streamReader = new StreamReader(response.Content.ReadAsStream(), requestData.Encoding);
|
|
|
+ //获取Cookie
|
|
|
+ CookieCollection cookies = new CookieCollection();
|
|
|
+ //转换响应头数据
|
|
|
+ Dictionary<string, string>? ResponseHeadersData = DisposeResponseData(response.Headers.ToString(), ref cookies, requestData.Url);
|
|
|
+ //响应数据
|
|
|
+ string? ResponseData = streamReader.ReadToEnd();
|
|
|
+ //状态码
|
|
|
+ int StateCode = (int)response.StatusCode;
|
|
|
+ //关闭
|
|
|
+ streamReader.Close();
|
|
|
+ //释放
|
|
|
+ streamReader.Dispose();
|
|
|
+ //返回数据
|
|
|
+ return Break("Request", true, "请求成功", new HttpData.ResponseData() { ResData = ResponseData, ResHeadersData = ResponseHeadersData, StatusCode = StateCode, ReqData = requestData, ResCookieData = cookies }, Core.@enum.ResultType.Dynamic);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ return Break("Request", false, ex.Message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 解析响应数据
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="Data"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ private Dictionary<string, string>? DisposeResponseData(string Data,ref CookieCollection cookieContainer,string url)
|
|
|
+ {
|
|
|
+ string[] Datas = Data.Split(new char[] { '\r', '\n' });
|
|
|
+ if (Datas.Length > 0)
|
|
|
+ {
|
|
|
+ Dictionary<string,string> tuples = new Dictionary<string, string>();
|
|
|
+ foreach (var item in Datas)
|
|
|
+ {
|
|
|
+ if (!string.IsNullOrEmpty(item))
|
|
|
+ {
|
|
|
+ string[] infos = item.Split(new char[] { ':' });
|
|
|
+ tuples.Add(infos[0], infos[1]);
|
|
|
+ if (infos[0].Equals("Set-Cookie"))
|
|
|
+ {
|
|
|
+ string[] strings = infos[1].Split(';');
|
|
|
+ string[] KV1 = strings[0].Split('=');
|
|
|
+ url = url.Replace("https:", "").Replace("http:", "").Replace("/", "");
|
|
|
+ cookieContainer.Add(new Cookie(KV1[0].Trim(), KV1[1].Trim(), "/", url.Trim()));
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return tuples;
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 释放
|
|
|
+ /// </summary>
|
|
|
+ public void Dispose()
|
|
|
+ {
|
|
|
+ GC.Collect();
|
|
|
+ GC.SuppressFinalize(this);
|
|
|
+ ThisObjList.Remove(this);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|