Initial_commit_SecMPS_v2
This commit is contained in:
@@ -0,0 +1,172 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Net.Http.Headers;
|
||||
using System.Reflection.PortableExecutable;
|
||||
using System.Security.Policy;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Web;
|
||||
|
||||
namespace VolPro.Core.Extensions
|
||||
{
|
||||
public static class HttpClientFactoryExtension
|
||||
{
|
||||
public static async Task<string> PostAsync(this IHttpClientFactory httpClientFactory, string url,
|
||||
object parameters = null,
|
||||
Dictionary<string, string> headers = null,
|
||||
string contentType = "application/x-www-form-urlencoded")
|
||||
{
|
||||
var request = InitPostData(url, parameters, headers, contentType);
|
||||
var client = httpClientFactory.CreateClient();
|
||||
using HttpResponseMessage httpResponseMessage = await client.SendAsync(request);
|
||||
return await httpResponseMessage.Content.ReadAsStringAsync();
|
||||
}
|
||||
public static async Task<(bool status, T data, string message)> PostAsync<T>(
|
||||
this IHttpClientFactory httpClientFactory,
|
||||
string url,
|
||||
object parameters = null,
|
||||
Dictionary<string, string> headers = null,
|
||||
string contentType = "application/x-www-form-urlencoded")
|
||||
{
|
||||
var request = InitPostData(url, parameters, headers, contentType);
|
||||
var client = httpClientFactory.CreateClient();
|
||||
using HttpResponseMessage httpResponseMessage = await client.SendAsync(request);
|
||||
string message = await httpResponseMessage.Content.ReadAsStringAsync();
|
||||
if (httpResponseMessage.StatusCode == HttpStatusCode.OK)
|
||||
{
|
||||
return (true, message.DeserializeObject<T>(), null);
|
||||
}
|
||||
return (false, default(T), httpResponseMessage.StatusCode + "," + message);
|
||||
}
|
||||
|
||||
public static async Task<string> GetAsync(this IHttpClientFactory httpClientFactory, string url,
|
||||
Dictionary<string, string> parameters = null,
|
||||
Dictionary<string, string> headers = null,
|
||||
string contentType = "application/x-www-form-urlencoded")
|
||||
{
|
||||
var client = httpClientFactory.CreateClient();
|
||||
var request = InitGetData(url, parameters, headers, contentType);
|
||||
using (HttpResponseMessage httpResponseMessage = await client.SendAsync(request))
|
||||
{
|
||||
string result = await httpResponseMessage.Content.ReadAsStringAsync();
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
public static async Task<(bool status, T data, string message)> GetAsync<T>(this IHttpClientFactory httpClientFactory, string url,
|
||||
Dictionary<string, string> parameters = null,
|
||||
Dictionary<string, string> headers = null,
|
||||
string contentType = "application/x-www-form-urlencoded")
|
||||
{
|
||||
var client = httpClientFactory.CreateClient();
|
||||
var request = InitGetData(url, parameters, headers, contentType);
|
||||
using HttpResponseMessage httpResponseMessage = await client.SendAsync(request);
|
||||
string message = await httpResponseMessage.Content.ReadAsStringAsync();
|
||||
if (httpResponseMessage.StatusCode == HttpStatusCode.OK)
|
||||
{
|
||||
return (true, message.DeserializeObject<T>(), null);
|
||||
}
|
||||
return (false, default(T), httpResponseMessage.StatusCode + "," + message);
|
||||
}
|
||||
private static HttpRequestMessage InitPostData(
|
||||
string url,
|
||||
object parameters = null,
|
||||
Dictionary<string, string> headers = null,
|
||||
string contentType = "application/x-www-form-urlencoded")
|
||||
{
|
||||
HttpContent content = null;
|
||||
|
||||
if (parameters != null)
|
||||
{
|
||||
// 根据Content-Type处理参数
|
||||
if (contentType.Equals("application/x-www-form-urlencoded", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
// 处理表单格式:转换为键值对并URL编码
|
||||
var formData = new FormUrlEncodedContent(ConvertToKeyValuePairs(parameters));
|
||||
content = formData;
|
||||
}
|
||||
else if (contentType.Equals("application/json", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
// 处理JSON格式
|
||||
string json = Newtonsoft.Json.JsonConvert.SerializeObject(parameters);
|
||||
content = new StringContent(json, Encoding.UTF8, "application/json");
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new NotSupportedException($"不支持的Content-Type: {contentType}");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 无参数时创建空内容
|
||||
content = new StringContent(string.Empty);
|
||||
}
|
||||
|
||||
var request = new HttpRequestMessage(HttpMethod.Post, url)
|
||||
{
|
||||
Content = content
|
||||
};
|
||||
// 设置内容类型(覆盖默认值)
|
||||
content.Headers.ContentType = new MediaTypeHeaderValue(contentType);
|
||||
|
||||
// 添加自定义请求头
|
||||
if (headers != null)
|
||||
{
|
||||
foreach (var item in headers)
|
||||
{
|
||||
// 注意:有些头信息(如Content-Type)不能通过这种方式添加,需要通过Content.Headers设置
|
||||
if (!content.Headers.TryAddWithoutValidation(item.Key, item.Value) &&
|
||||
!item.Key.Equals("Content-Type", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
// 如果头信息不能添加到内容头,则尝试添加到请求头
|
||||
request.Headers.TryAddWithoutValidation(item.Key, item.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return request;
|
||||
}
|
||||
private static HttpRequestMessage InitGetData(
|
||||
string url,
|
||||
Dictionary<string, string> parameters = null,
|
||||
Dictionary<string, string> headers = null,
|
||||
string contentType = "application/x-www-form-urlencoded")
|
||||
{
|
||||
var content = new StringContent("");
|
||||
if (parameters != null)
|
||||
{
|
||||
url += string.Join("&", parameters.Select(s => s.Key + "=" + HttpUtility.UrlEncode(s.Value)));
|
||||
}
|
||||
content.Headers.ContentType = new MediaTypeHeaderValue(contentType);
|
||||
var request = new HttpRequestMessage(HttpMethod.Get, url)
|
||||
{
|
||||
Content = content
|
||||
};
|
||||
if (headers != null)
|
||||
{
|
||||
foreach (var item in headers)
|
||||
{
|
||||
request.Headers.Add(item.Key, item.Value);
|
||||
}
|
||||
}
|
||||
return request;
|
||||
}
|
||||
// 将对象转换为键值对(用于表单提交)
|
||||
private static IEnumerable<KeyValuePair<string, string>> ConvertToKeyValuePairs(object obj)
|
||||
{
|
||||
var dict = new Dictionary<string, string>();
|
||||
if (obj == null) return dict;
|
||||
|
||||
var properties = obj.GetType().GetProperties();
|
||||
foreach (var prop in properties)
|
||||
{
|
||||
var value = prop.GetValue(obj)?.ToString() ?? string.Empty;
|
||||
dict.Add(prop.Name, value);
|
||||
}
|
||||
return dict;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user