421 lines
15 KiB
C#
421 lines
15 KiB
C#
|
|
using Newtonsoft.Json;
|
|||
|
|
using System.Net.Http.Headers;
|
|||
|
|
using System.Net;
|
|||
|
|
|
|||
|
|
namespace LY.App.Common.HttpUtil
|
|||
|
|
{
|
|||
|
|
public static class RequestUtil
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// 是否已经初始化加密协议
|
|||
|
|
/// </summary>
|
|||
|
|
private static bool _securitinit = false;
|
|||
|
|
/// <summary>
|
|||
|
|
/// 初始化加密协议
|
|||
|
|
/// </summary>
|
|||
|
|
public static void InitialSecurity()
|
|||
|
|
{
|
|||
|
|
if (_securitinit) return;
|
|||
|
|
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
|
|||
|
|
| SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13;
|
|||
|
|
}
|
|||
|
|
catch (Exception)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
|
|||
|
|
| SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
|
|||
|
|
}
|
|||
|
|
catch (Exception)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11;
|
|||
|
|
}
|
|||
|
|
catch (Exception)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
|
|||
|
|
}
|
|||
|
|
catch (Exception) { }
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => true;
|
|||
|
|
_securitinit = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 获取HTTP连接
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="haveSSL">是否ssl连接</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static HttpClient GetClient(bool haveSSL)
|
|||
|
|
{
|
|||
|
|
if (haveSSL)
|
|||
|
|
{
|
|||
|
|
InitialSecurity();
|
|||
|
|
var handle = new HttpClientHandler();
|
|||
|
|
handle.ServerCertificateCustomValidationCallback
|
|||
|
|
= HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
|
|||
|
|
return new HttpClient(handle);
|
|||
|
|
}
|
|||
|
|
else return new HttpClient();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 异步请求GET
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="url">网址</param>
|
|||
|
|
/// <param name="headers">头部信息</param>
|
|||
|
|
/// <param name="auth">验证信息</param>
|
|||
|
|
/// <param name="timeout">过期时间</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static async Task<string> GetAsync(string url,
|
|||
|
|
Dictionary<string, string> headers = null,
|
|||
|
|
AuthenticationHeaderValue auth = null, int timeout = 5000)
|
|||
|
|
{
|
|||
|
|
using (var client = GetClient(url.StartsWith("https")))
|
|||
|
|
{
|
|||
|
|
client.Timeout = TimeSpan.FromMilliseconds(timeout);
|
|||
|
|
if (headers != null && headers.Any())
|
|||
|
|
{
|
|||
|
|
foreach (var item in headers)
|
|||
|
|
{
|
|||
|
|
client.DefaultRequestHeaders.Add(item.Key, item.Value);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (auth != null)
|
|||
|
|
client.DefaultRequestHeaders.Authorization = auth;
|
|||
|
|
|
|||
|
|
var result = await client.GetAsync(url);
|
|||
|
|
if (result.IsSuccessStatusCode)
|
|||
|
|
return await result.Content.ReadAsStringAsync();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 异步请求GET
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="url">网址</param>
|
|||
|
|
/// <param name="headers">头部信息</param>
|
|||
|
|
/// <param name="auth">验证信息</param>
|
|||
|
|
/// <param name="timeout">过期时间</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static async Task<Stream> GetStreamAsync(string url,
|
|||
|
|
Dictionary<string, string> headers = null,
|
|||
|
|
AuthenticationHeaderValue auth = null, int timeout = 5000)
|
|||
|
|
{
|
|||
|
|
using (var client = GetClient(url.StartsWith("https")))
|
|||
|
|
{
|
|||
|
|
client.Timeout = TimeSpan.FromMilliseconds(timeout);
|
|||
|
|
if (headers != null && headers.Any())
|
|||
|
|
{
|
|||
|
|
foreach (var item in headers)
|
|||
|
|
{
|
|||
|
|
client.DefaultRequestHeaders.Add(item.Key, item.Value);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (auth != null)
|
|||
|
|
client.DefaultRequestHeaders.Authorization = auth;
|
|||
|
|
|
|||
|
|
var result = await client.GetAsync(url);
|
|||
|
|
if (result.IsSuccessStatusCode)
|
|||
|
|
return await result.Content.ReadAsStreamAsync();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 删除
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="url"></param>
|
|||
|
|
/// <param name="headers"></param>
|
|||
|
|
/// <param name="auth"></param>
|
|||
|
|
/// <param name="timeout"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static async Task<string> DeleteAsync(string url,
|
|||
|
|
Dictionary<string, string> headers = null,
|
|||
|
|
AuthenticationHeaderValue auth = null, int timeout = 5000)
|
|||
|
|
{
|
|||
|
|
using (var client = GetClient(url.StartsWith("https")))
|
|||
|
|
{
|
|||
|
|
client.Timeout = TimeSpan.FromMilliseconds(timeout);
|
|||
|
|
if (headers != null && headers.Any())
|
|||
|
|
{
|
|||
|
|
foreach (var item in headers)
|
|||
|
|
{
|
|||
|
|
client.DefaultRequestHeaders.Add(item.Key, item.Value);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (auth != null)
|
|||
|
|
client.DefaultRequestHeaders.Authorization = auth;
|
|||
|
|
|
|||
|
|
var result = await client.DeleteAsync(url);
|
|||
|
|
if (result.IsSuccessStatusCode)
|
|||
|
|
return await result.Content.ReadAsStringAsync();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 异步请求并解析
|
|||
|
|
/// </summary>
|
|||
|
|
/// <typeparam name="T"></typeparam>
|
|||
|
|
/// <param name="url">网址</param>
|
|||
|
|
/// <param name="headers">头部信息</param>
|
|||
|
|
/// <param name="auth">验证信息</param>
|
|||
|
|
/// <param name="timeout">过期时间</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static async Task<T> GetAsync<T>(string url,
|
|||
|
|
Dictionary<string, string> headers = null,
|
|||
|
|
AuthenticationHeaderValue auth = null,
|
|||
|
|
int timeout = 5000)
|
|||
|
|
{
|
|||
|
|
var result = await GetAsync(url, headers, auth, timeout);
|
|||
|
|
if (result != null)
|
|||
|
|
return JsonConvert.DeserializeObject<T>(result);
|
|||
|
|
|
|||
|
|
return default;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 返回btye[]
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="url"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static async Task<byte[]> GetAsync(string url)
|
|||
|
|
{
|
|||
|
|
using (var client = GetClient(url.StartsWith("https")))
|
|||
|
|
{
|
|||
|
|
client.Timeout = TimeSpan.FromMilliseconds(2000);
|
|||
|
|
var result = await client.GetAsync(url);
|
|||
|
|
if (result.IsSuccessStatusCode)
|
|||
|
|
return await result.Content.ReadAsByteArrayAsync();
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static AuthenticationHeaderValue GetTokenHeader(string token)
|
|||
|
|
{
|
|||
|
|
return new AuthenticationHeaderValue("Bearer", token);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 异步请求POST
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="url">网址</param>
|
|||
|
|
/// <param name="dataJson">信息</param>
|
|||
|
|
/// <param name="headers">头部信息</param>
|
|||
|
|
/// <param name="auth">验证信息</param>
|
|||
|
|
/// <param name="timeout">过期时间</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static async Task<string> PostAsync(string url,
|
|||
|
|
string dataJson = null,
|
|||
|
|
Dictionary<string, string> headers = null,
|
|||
|
|
AuthenticationHeaderValue auth = null, int timeout = 5000)
|
|||
|
|
{
|
|||
|
|
using (var client = GetClient(url.StartsWith("https")))
|
|||
|
|
{
|
|||
|
|
client.Timeout = TimeSpan.FromMilliseconds(timeout);
|
|||
|
|
if (headers != null && headers.Any())
|
|||
|
|
{
|
|||
|
|
foreach (var item in headers)
|
|||
|
|
{
|
|||
|
|
client.DefaultRequestHeaders.Add(item.Key, item.Value);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (auth != null)
|
|||
|
|
client.DefaultRequestHeaders.Authorization = auth;
|
|||
|
|
|
|||
|
|
StringContent content = null;
|
|||
|
|
|
|||
|
|
if (dataJson != null)
|
|||
|
|
{
|
|||
|
|
content = new StringContent(dataJson);
|
|||
|
|
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var result = await client.PostAsync(url, content);
|
|||
|
|
if (result.IsSuccessStatusCode)
|
|||
|
|
return await result.Content.ReadAsStringAsync();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 异步请求POST
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="url">网址</param>
|
|||
|
|
/// <param name="data">消息</param>
|
|||
|
|
/// <param name="headers">头部信息</param>
|
|||
|
|
/// <param name="auth">验证信息</param>
|
|||
|
|
/// <param name="timeout">过期时间</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static async Task<string> PostAsync(string url,
|
|||
|
|
Dictionary<string, string> data,
|
|||
|
|
Dictionary<string, string> headers = null,
|
|||
|
|
AuthenticationHeaderValue auth = null, int timeout = 5000)
|
|||
|
|
{
|
|||
|
|
return await PostAsync(url, JsonConvert.SerializeObject(data), headers, auth, timeout);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 异步请求POST
|
|||
|
|
/// </summary>
|
|||
|
|
/// <typeparam name="T"></typeparam>
|
|||
|
|
/// <param name="url">网址</param>
|
|||
|
|
/// <param name="dataJson">信息</param>
|
|||
|
|
/// <param name="headers">头部信息</param>
|
|||
|
|
/// <param name="auth">验证信息</param>
|
|||
|
|
/// <param name="timeout">过期时间</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static async Task<T> PostAsync<T>(string url,
|
|||
|
|
string dataJson = null,
|
|||
|
|
Dictionary<string, string> headers = null,
|
|||
|
|
AuthenticationHeaderValue auth = null, int timeout = 5000)
|
|||
|
|
{
|
|||
|
|
var result = await PostAsync(url, dataJson, headers, auth, timeout);
|
|||
|
|
return JsonConvert.DeserializeObject<T>(result);
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
/// <typeparam name="T"></typeparam>
|
|||
|
|
/// <param name="url">网址</param>
|
|||
|
|
/// <param name="data">消息</param>
|
|||
|
|
/// <param name="headers">头部信息</param>
|
|||
|
|
/// <param name="auth">验证信息</param>
|
|||
|
|
/// <param name="timeout">过期时间</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static async Task<T> PostAsync<T>(string url,
|
|||
|
|
Dictionary<string, string> data = null,
|
|||
|
|
Dictionary<string, string> headers = null,
|
|||
|
|
AuthenticationHeaderValue auth = null, int timeout = 5000)
|
|||
|
|
{
|
|||
|
|
return await PostAsync<T>(url, JsonConvert.SerializeObject(data), headers, auth, timeout);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 异步推送数据流
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="url">网址</param>
|
|||
|
|
/// <param name="stream">数据流</param>
|
|||
|
|
/// <param name="headers">头部信息</param>
|
|||
|
|
/// <param name="auth">验证信息</param>
|
|||
|
|
/// <param name="timeout">过期时间</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static async Task<string> PutStreamAsync(
|
|||
|
|
string url, Stream stream,
|
|||
|
|
Dictionary<string, string> headers = null,
|
|||
|
|
AuthenticationHeaderValue auth = null, int timeout = 10000)
|
|||
|
|
{
|
|||
|
|
using (var client = GetClient(url.StartsWith("https")))
|
|||
|
|
{
|
|||
|
|
client.Timeout = TimeSpan.FromMilliseconds(timeout);
|
|||
|
|
if (headers != null && headers.Any())
|
|||
|
|
{
|
|||
|
|
foreach (var item in headers)
|
|||
|
|
{
|
|||
|
|
client.DefaultRequestHeaders.Add(item.Key, item.Value);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (auth != null)
|
|||
|
|
client.DefaultRequestHeaders.Authorization = auth;
|
|||
|
|
|
|||
|
|
StreamContent content = null;
|
|||
|
|
|
|||
|
|
if (stream != null)
|
|||
|
|
{
|
|||
|
|
content = new StreamContent(stream);
|
|||
|
|
content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var result = await client.PutAsync(url, content);
|
|||
|
|
if (result.IsSuccessStatusCode)
|
|||
|
|
return await result.Content.ReadAsStringAsync();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 异步推送数据流
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="url">网址</param>
|
|||
|
|
/// <param name="stream">数据流</param>
|
|||
|
|
/// <param name="headers">头部信息</param>
|
|||
|
|
/// <param name="auth">验证信息</param>
|
|||
|
|
/// <param name="timeout">过期时间</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static async Task<T> PutStreamAsync<T>(
|
|||
|
|
string url, Stream stream,
|
|||
|
|
Dictionary<string, string> headers = null,
|
|||
|
|
AuthenticationHeaderValue auth = null, int timeout = 10000)
|
|||
|
|
{
|
|||
|
|
var result = await PutStreamAsync(url, stream, headers, auth, timeout);
|
|||
|
|
return JsonConvert.DeserializeObject<T>(result);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// PUT请求
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="url"></param>
|
|||
|
|
/// <param name="dataJson"></param>
|
|||
|
|
/// <param name="headers"></param>
|
|||
|
|
/// <param name="auth"></param>
|
|||
|
|
/// <param name="timeout"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static async Task<string> PutAsync(string url,
|
|||
|
|
string dataJson = null,
|
|||
|
|
Dictionary<string, string> headers = null,
|
|||
|
|
AuthenticationHeaderValue auth = null, int timeout = 5000)
|
|||
|
|
{
|
|||
|
|
using (var client = GetClient(url.StartsWith("https")))
|
|||
|
|
{
|
|||
|
|
client.Timeout = TimeSpan.FromMilliseconds(timeout);
|
|||
|
|
if (headers != null && headers.Any())
|
|||
|
|
{
|
|||
|
|
foreach (var item in headers)
|
|||
|
|
{
|
|||
|
|
client.DefaultRequestHeaders.Add(item.Key, item.Value);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (auth != null)
|
|||
|
|
client.DefaultRequestHeaders.Authorization = auth;
|
|||
|
|
|
|||
|
|
StringContent content = null;
|
|||
|
|
|
|||
|
|
if (dataJson != null)
|
|||
|
|
{
|
|||
|
|
content = new StringContent(dataJson);
|
|||
|
|
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var result = await client.PutAsync(url, content);
|
|||
|
|
if (result.IsSuccessStatusCode)
|
|||
|
|
return await result.Content.ReadAsStringAsync();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|