using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
namespace YLErp.Modules.ApiModule
{
///
/// HTTP请求帮助
///
public class HttpClientWrap
{
readonly HttpClient _httpClient;
public HttpClientWrap(HttpClient httpClient)
{
_httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient));
SetServicePointManager();
}
public HttpClientWrap(string baseAddress, int timeoutSeconds = 15)
{
if (timeoutSeconds < 1)
{
timeoutSeconds = 15;
}
var handler = new HttpClientHandler
{
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
_httpClient = new HttpClient(handler) { Timeout = TimeSpan.FromSeconds(timeoutSeconds) };
if (!string.IsNullOrWhiteSpace(baseAddress))
{
_httpClient.BaseAddress = new Uri(baseAddress);
}
SetServicePointManager();
}
private static void SetServicePointManager()
{
ServicePointManager.Expect100Continue = false;
ServicePointManager.DefaultConnectionLimit = 100;
}
public Uri BaseAddress
{
get { return _httpClient.BaseAddress; }
}
public TimeSpan TimeOut
{
get { return _httpClient.Timeout; }
}
///
///
///
public string Get(string apiPathAndQuery, Action requestHandle)
{
using (var request = new HttpRequestMessage()
{
Method = HttpMethod.Get,
RequestUri = new Uri(_httpClient.BaseAddress, apiPathAndQuery)
})
{
request.Headers.Add("Accept-Encoding", "gzip");
requestHandle?.Invoke(request);
using (var response = _httpClient.SendAsync(request).Result)
{
response.EnsureSuccessStatusCode();
return response.Content.ReadAsStringAsync().Result;
}
}
}
///
/// 发送Post请求
///
///
///
///
public static async Task PostAsync(string url, string data, int timeoutSeconds = 15)
{
using (var client = new HttpClient())
{
client.Timeout = TimeSpan.FromSeconds(timeoutSeconds);
var content = new StringContent(data, Encoding.UTF8, "application/json");
var response = await client.PostAsync(url, content);
return await response.Content.ReadAsStringAsync();
}
}
///
/// POST提交JSON请求到WebAPI并将返回字符串结果
///
public string PostJson(string apiPath, object postData, Action requestHandle)
{
var str = JsonHelper.Serialize(postData) ?? string.Empty;
using (var content = new StringContent(str, Encoding.UTF8, "application/json"))
using (var request = new HttpRequestMessage()
{
Method = HttpMethod.Post,
RequestUri = new Uri(_httpClient.BaseAddress, apiPath),
Content = content
})
{
request.Headers.Add("Accept-Encoding", "gzip");
requestHandle?.Invoke(request);
// content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
LogFactory.GetLogger().Info($"url:{apiPath}\r\npostData:{str}\r\n{content.ToJson()}");
try
{
using (var response = _httpClient.SendAsync(request).Result)
{
response.EnsureSuccessStatusCode();
return response.Content.ReadAsStringAsync().Result;
}
}
catch (Exception ex)
{
LogFactory.GetLogger().Error(ex);
throw;
}
}
}
public async Task PostMultipartFormDataAsync(string apiPath, Dictionary postDatas, Action requestHandle)
{
var postContent = new MultipartFormDataContent();
if (postDatas != null)
{
foreach (var item in postDatas)
{
postContent.Add(item.Value, item.Key);
LogFactory.GetLogger().Info($"url:{apiPath}\r\npostData:{item.Key}:{item.ToJson()}");
}
}
using var request = new HttpRequestMessage()
{
Method = HttpMethod.Post,
RequestUri = new Uri(_httpClient.BaseAddress, apiPath),
Content = postContent
};
request.Headers.Add("Accept-Encoding", "gzip");
requestHandle?.Invoke(request);
try
{
using var response = await _httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
LogFactory.GetLogger().Error(ex);
throw;
}
}
}
}