Files
SecMPS/api_sqlsugar/VolPro.Core/Extensions/HttpClientFactoryExtension.cs
2026-05-15 23:22:48 +08:00

173 lines
7.3 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
}
}
}