using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Net.Http; using System.Net.Http.Headers; using System.Text; using System.Text.Json; using System.Threading.Tasks; using WMS.Web.Core.Exceptions; using WMS.Web.Domain.IService.Public; namespace WMS.Web.Domain.Services.Public { public class HttpClientService : IHttpClientService { private readonly IHttpClientFactory _clientFactory; private readonly ILogger _logger; private Dictionary headers; private Dictionary contentHeaders; public HttpClientService(IHttpClientFactory clientFactory, ILogger logger) { _clientFactory = clientFactory; _logger = logger; headers = new Dictionary(); headers.Add("Accept", "application/json"); headers.Add("User-Agent", "HttpClientFactory-Sample"); contentHeaders = new Dictionary(); contentHeaders.Add("Content-Type", "application/json; charset=utf-8"); } /// /// Get方法 /// /// /// /// /// /// public async Task GetAsync(string url, int timeoutSecond = 180) { try { var client = BuildHttpClient(headers, timeoutSecond); var response = await client.GetAsync(url); //var responseContent = await response.Content.ReadAsStreamAsync();//1.相比ReadAsString这个方法返回要快点,效率高 var responseContent = await response.Content.ReadAsStringAsync(); //2.当前使用这里是为了迎合错误信息观看 if (response.IsSuccessStatusCode) { var t = JsonSerializer.Deserialize(responseContent, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); //var t = await JsonSerializer.DeserializeAsync(responseContent, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });//3.配合1的ReadAsStream使用 return t; } throw new WebHttpException(response.StatusCode.ToString(), "请求出错"); } catch (Exception ex) { _logger.LogError($"HttpGet:{url} Error:{ex.Message}"); throw new Exception($"HttpGet:{url} Error", ex); } } /// /// Get方法 /// /// /// /// /// /// public async Task GetAsync(string url, Dictionary dicHeaders, int timeoutSecond = 180) { try { var client = BuildHttpClient(dicHeaders, timeoutSecond); var response = await client.GetAsync(url); //var responseContent = await response.Content.ReadAsStreamAsync();//1.相比ReadAsString这个方法返回要快点,效率高 var responseContent = await response.Content.ReadAsStringAsync(); //2.当前使用这里是为了迎合错误信息观看 if (response.IsSuccessStatusCode) { var t = JsonSerializer.Deserialize(responseContent, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); //var t = await JsonSerializer.DeserializeAsync(responseContent, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });//3.配合1的ReadAsStream使用 return t; } throw new WebHttpException(response.StatusCode.ToString(), "请求出错"); } catch (Exception ex) { _logger.LogError($"HttpGet:{url} Error:{ex.Message}"); throw new Exception($"HttpGet:{url} Error", ex); } } /// /// Post方法 /// /// /// /// /// /// /// public async Task PostAsync(string url, string requestBody, Dictionary dicHeaders, int timeoutSecond = 180) { var client = BuildHttpClient(dicHeaders, timeoutSecond); var requestContent = GenerateStringContent(requestBody, contentHeaders); var response = await client.PostAsync(url, requestContent); var responseContent = await response.Content.ReadAsStringAsync(); if (response.IsSuccessStatusCode) { var t = JsonSerializer.Deserialize(responseContent, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); return t; } _logger.LogError($"HttpGet:{url} Error:{responseContent}"); throw new WebHttpException(response.StatusCode.ToString(), responseContent); } /// /// Post方法 /// /// /// /// /// /// public async Task PostAsync(string url, string requestBody, int timeoutSecond = 180) { var client = BuildHttpClient(null, timeoutSecond); var requestContent = GenerateStringContent(requestBody, contentHeaders); var response = await client.PostAsync(url, requestContent); var responseContent = await response.Content.ReadAsStringAsync(); if (response.IsSuccessStatusCode) { var t = JsonSerializer.Deserialize(responseContent, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); if (t == null) _logger.LogInformation($"获取单点数据为空---{responseContent}"); return t; } _logger.LogError($"HttpGet:{url} Error:{responseContent}"); throw new WebHttpException(response.StatusCode.ToString(), responseContent); } /// /// 公共http请求 /// /// /// /// /// /// /// /// public async Task ExecuteAsync(string url, HttpMethod method, string requestBody, Dictionary dicHeaders, int timeoutSecond = 180) { var client = BuildHttpClient(null, timeoutSecond); var request = GenerateHttpRequestMessage(url, requestBody, method, dicHeaders); var response = await client.SendAsync(request); var responseContent = await response.Content.ReadAsStringAsync(); if (response.IsSuccessStatusCode) { var t = JsonSerializer.Deserialize(responseContent, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); return t; } throw new WebHttpException(response.StatusCode.ToString(), responseContent); } /// /// 设置HttpRequestMessage /// /// /// /// /// /// private HttpRequestMessage GenerateHttpRequestMessage(string url, string requestBody, HttpMethod method, Dictionary dicHeaders) { var request = new HttpRequestMessage(method, url); if (!string.IsNullOrEmpty(requestBody)) request.Content = new StringContent(requestBody); if (dicHeaders != null) foreach (var headerItme in dicHeaders) request.Headers.Add(headerItme.Key, headerItme.Value); return request; } /// /// 设置请求内容 /// /// /// /// private StringContent GenerateStringContent(string requestBody, Dictionary dicHeaders) { var content = new StringContent(requestBody); if (dicHeaders != null) content.Headers.Remove("content-type"); foreach (var headerItme in dicHeaders) content.Headers.Add(headerItme.Key, headerItme.Value); return content; } /// /// 设置请求头和超时时间:返回client /// /// /// /// public HttpClient BuildHttpClient(Dictionary dicDefaultHeaders, int? timeoutSecond=180) { var httpClient = _clientFactory.CreateClient("ops_client"); httpClient.DefaultRequestHeaders.Clear(); //为了使客户端不受最后一个请求的影响,它需要清除DefaultRequestHeaders httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); if (dicDefaultHeaders != null) foreach (var headItem in dicDefaultHeaders) if (!httpClient.DefaultRequestHeaders.Contains(headItem.Key)) httpClient.DefaultRequestHeaders.Add(headItem.Key, headItem.Value); if (timeoutSecond != null) httpClient.Timeout = TimeSpan.FromSeconds(timeoutSecond.Value); return httpClient; } } }