using System.Diagnostics; using System.Net.Http.Headers; using System.Text; using ApiTool.Dto; using Newtonsoft.Json; namespace ApiTool; public class WebApiPost { /* * 作者:菻蔃 * * 版本时间:2024年5月10日 * */ public WebApiPost() { } private string? _baseUrl = string.Empty; private Action? _apiAction; public WebApiPost(Action apiAction) { _apiAction = apiAction; } public WebApiPost(string url, Action action) { _baseUrl = url; _apiAction = action; } /// /// 设置响应事件, /// /// public void SetResponseAction(Action action) { _apiAction = action; } public void SetBaseUrl(string url) { _baseUrl = url; } /// /// 执行POST请求 /// /// /// /// /// /// /// public ApiResponseInfo HttpPost(TRequest requestEntity, string method = "", int time = 10000) where TRequest : class where TResponse : class, new() { ApiResponseInfo result = new() { RequestMethod = "POST" }; string address = _baseUrl + method; Encoding encoding = Encoding.UTF8; Stopwatch sw = new(); string sendMes = JsonConvert.SerializeObject(requestEntity); sw.Start(); try { HttpContent content = new StringContent(sendMes, encoding, "application/json"); HttpClient client = new(); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); client.Timeout = new TimeSpan(0, 0, 0, 0, time); result.RequestTime = DateTime.Now; var requestTask = client.PostAsync(address, content); requestTask.Wait(); var responseResult = requestTask.Result; if (responseResult.IsSuccessStatusCode) { var responseRead = responseResult.Content.ReadAsStringAsync(); responseRead.Wait(); string responseString = responseRead.Result; result.IsSend = true; result.RequestMsg = sendMes; result.RequestUrl = address; result.ResponseMsg = responseString; result.ResponseEntity = JsonConvert.DeserializeObject(responseString); } else { var responseCode = responseResult.StatusCode; var responseRead = responseResult.Content.ReadAsStringAsync(); responseRead.Wait(); string responseString = responseRead.Result; result.IsSend = false; result.RequestMsg = sendMes; result.RequestUrl = address; result.RequestException = new Exception($"[{responseCode}]{responseString}"); } } catch (Exception ex) { result.IsSend = false; result.RequestMsg = sendMes; result.RequestUrl = address; result.RequestException = ex; } result.ResponseTime = DateTime.Now; sw.Stop(); result.ResponseTime = DateTime.Now; TimeSpan ts = sw.Elapsed; result.UseTime = ts.TotalMilliseconds; _apiAction?.Invoke(result); return result; } }