using System.Net;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using Long.Core.Api;
using Long.Core.Extensions;
using Long.Utils.Cache;
namespace Long.Utils.Network;
///
/// 网络请求类
///
public static class Request
{
private static readonly string _ObjectCachingkey = "Long.Utils.Request.Authorization";
///
/// 设置认证信息
///
///
///
public static async Task SetAuthorization(LongToken token)
{
if (ObjectCaching.Contains(_ObjectCachingkey))
{
ObjectCaching.Remove(_ObjectCachingkey);
}
ObjectCaching.Add(_ObjectCachingkey, token);
}
///
/// 请求数据
///
///
///
/// 是否使用 token,默认 true
///
public static async Task> GetAsync(string url, bool isToken = true)
{
return await GetAsync(url, null, isToken);
}
///
/// 请求数据
///
///
///
/// 请求参数
/// 是否使用 token,默认 true
///
public static async Task> GetAsync(string url, object param, bool isToken = true)
{
var result = new RequestResult();
try
{
var paramStr = "";
bool hasUrlParam = url.IndexOf("?") > -1;
if (param != null)
{
Type type = param.GetType();
foreach (var item in type.GetProperties())
{
if (hasUrlParam)
{
paramStr += "&";
}
else
{
hasUrlParam = true;
paramStr += "?";
}
paramStr += item.Name + "=" + item.GetValue(param).ToString();
}
url += paramStr;
}
HttpClient client = null;
if (isToken)
{
client = GetTokenHttpClient();
}
else
{
client = GetHttpClient();
}
var httpResponse = await client.GetAsync(url);
var bytes = await httpResponse.Content.ReadAsByteArrayAsync();
result.StatusCode = httpResponse.StatusCode;
var decodeStr = Encoding.UTF8.GetString(bytes);
if (decodeStr.IsXML() && decodeStr.IndexOf("meta charset=\"gb2312\"") > 0)
{
decodeStr = Encoding.GetEncoding("gb2312").GetString(bytes);
}
if (httpResponse.StatusCode == HttpStatusCode.OK)
{
var res = decodeStr.IsJSON() ? JsonSerializer.Deserialize>(decodeStr) : new ApiResult()
{
Success = false,
Result = default(T),
Message = ""
};
if (res.Success)
{
result.Success = true;
result.Result = res.Result;
}
else
{
result.Success = false;
result.Message = res.Message;
}
}
else
{
result.Success = false;
result.Result = default(T);
result.Message = decodeStr;
}
}
catch (Exception ex)
{
result.Success = false;
result.Result = default(T);
result.Message = ex.Message;
}
return result;
}
public static async Task> GetAsync(string url, bool isToken = true)
{
return await GetAsync(url, null, isToken);
}
public static async Task> GetAsync(string url, object param, bool isToken = true)
{
var result = new RequestResult();
try
{
var paramStr = "";
bool hasUrlParam = url.IndexOf("?") > -1;
if (param != null)
{
Type type = param.GetType();
foreach (var item in type.GetProperties())
{
if (hasUrlParam)
{
paramStr += "&";
}
else
{
hasUrlParam = true;
paramStr += "?";
}
paramStr += item.Name + "=" + item.GetValue(param).ToString();
}
url += paramStr;
}
HttpClient client = null;
if (isToken)
{
client = GetTokenHttpClient();
}
else
{
client = GetHttpClient();
}
var httpResponse = await client.GetAsync(url);
var bytes = await httpResponse.Content.ReadAsByteArrayAsync();
result.StatusCode = httpResponse.StatusCode;
var decodeStr = Encoding.UTF8.GetString(bytes);
if (decodeStr.IsXML() && decodeStr.IndexOf("meta charset=\"gb2312\"") > 0)
{
decodeStr = Encoding.GetEncoding("gb2312").GetString(bytes);
}
if (httpResponse.StatusCode == HttpStatusCode.OK)
{
result.Success = true;
result.Result = decodeStr;
}
else
{
result.Success = false;
result.Message = decodeStr;
}
}
catch (Exception ex)
{
result.Success = false;
result.Message = ex.Message;
}
return result;
}
///
/// 发送数据
///
///
///
///
///
public static async Task> PostAsync(string url, bool isToken = true)
{
return await PostAsync(null, url, isToken);
}
public static async Task> PostAsync(HttpContent httpContent, string url, bool isToken = true)
{
var result = new RequestResult();
HttpClient client = null;
try
{
if (isToken)
{
client = GetTokenHttpClient();
}
else
{
client = GetHttpClient();
}
if (httpContent == null)
{
httpContent = new StringContent("");
}
var httpResponse = await client.PostAsync(url, httpContent);
var bytes = await httpResponse.Content.ReadAsByteArrayAsync();
result.StatusCode = httpResponse.StatusCode;
var decodeStr = Encoding.UTF8.GetString(bytes);
if (decodeStr.IsXML() && decodeStr.IndexOf("meta charset=\"gb2312\"") > 0)
{
decodeStr = Encoding.GetEncoding("gb2312").GetString(bytes);
}
if (httpResponse.StatusCode == HttpStatusCode.OK)
{
var res = decodeStr.IsJSON() ? JsonSerializer.Deserialize>(decodeStr) : new ApiResult()
{
Success = false,
Result = default(T),
Message = ""
};
if (res.Success)
{
result.Success = true;
result.Result = res.Result;
}
else
{
result.Success = false;
result.Message = res.Message;
}
}
else
{
result.Success = false;
result.Result = default(T);
result.Message = decodeStr;
}
}
catch (Exception ex)
{
result.Success = false;
result.Result = default(T);
result.Message = ex.Message.IndexOf("Timeout of") > 0 ? "" : ex.Message;
}
return result;
}
public static async Task> PostAsync(string url, bool isToken = true)
{
return await PostAsync(url, null, isToken);
}
public static async Task> PostAsync(HttpContent httpContent, string url, bool isToken = true)
{
var result = new RequestResult();
HttpClient client = null;
try
{
if (isToken)
{
client = GetTokenHttpClient();
}
else
{
client = GetHttpClient();
}
if (httpContent == null)
{
httpContent = new StringContent("");
}
var httpResponse = await client.PostAsync(url, httpContent);
var bytes = await httpResponse.Content.ReadAsByteArrayAsync();
result.StatusCode = httpResponse.StatusCode;
var decodeStr = Encoding.UTF8.GetString(bytes);
if (decodeStr.IsXML() && decodeStr.IndexOf("meta charset=\"gb2312\"") > 0)
{
decodeStr = Encoding.GetEncoding("gb2312").GetString(bytes);
}
if (httpResponse.StatusCode == HttpStatusCode.OK)
{
result.Success = true;
result.Result = decodeStr;
}
else
{
result.Success = false;
result.Message = decodeStr;
}
}
catch (Exception ex)
{
result.Success = false;
result.Message = ex.Message.IndexOf("Timeout of") > 0 ? "" : ex.Message;
}
return result;
}
///
/// 发送数据
///
///
///
///
/// 是否使用 token,默认 true
///
public static async Task> PostAsync(string url, object data, bool isToken = true)
{
var content = Request.GetStringContent(data, Encoding.UTF8, "text/json");
return await Request.PostAsync(content, url, isToken);
}
///
/// 发送数据
///
///
///
///
/// 是否使用 token,默认 true
///
public static async Task> PostAsync(string url, object data, bool isToken = true)
{
var content = Request.GetStringContent(data, Encoding.UTF8, "text/json");
return await Request.PostAsync(content, url, isToken);
}
public static async Task> PostFormUrlEncodedAsync(string url, object data, bool isToken = true)
{
var content = Request.GetFormUrlEncodedContent(data);
return await Request.PostAsync(content, url, isToken);
}
///
/// 获取 HttpClient 对象
///
///
public static HttpClient GetHttpClient()
{
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("KeepAlive", "false");
return client;
}
///
/// 获取带 Token 的 HttpClient 对象
///
///
public static HttpClient GetTokenHttpClient()
{
HttpClient client = GetHttpClient();
var token = ObjectCaching.Get(_ObjectCachingkey);
if (token != null)
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(token.token_type, token.access_token);
}
return client;
}
public static StringContent GetStringContent(object data, Encoding encoding, string type)
{
var dataStr = JsonSerializer.Serialize(data);
return new StringContent(dataStr, encoding, type);
}
public static FormUrlEncodedContent GetFormUrlEncodedContent(object data)
{
var result = new List>();
var type = data.GetType();
foreach (var item in type.GetProperties())
{
string value = item.GetValue(data)?.ToString() ?? "";
result.Add(new KeyValuePair(item.Name, value));
}
return new FormUrlEncodedContent(result);
}
public static MultipartFormDataContent GetMultipartFormDataContent(object data)
{
var result = new MultipartFormDataContent();
result.Add(Request.GetFormUrlEncodedContent(data));
return result;
}
}
///
/// 网络请求结果类
///
///
public class RequestResult
{
public T Result { get; set; }
public bool Success { get; set; }
public string Message { get; set; }
public HttpStatusCode StatusCode { get; set; }
}