BaseHttpClient.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. using AmrControl.Common.HttpClients;
  2. using Newtonsoft.Json;
  3. using Newtonsoft.Json.Converters;
  4. using System.Collections;
  5. namespace AmrControl.Common.HttpClients
  6. {
  7. public abstract class BaseHttpClient : IHttpRequest
  8. {
  9. /// <summary>
  10. /// httpclient
  11. /// </summary>
  12. protected readonly HttpClient _httpClient;
  13. /// <summary>
  14. /// 根路径
  15. /// </summary>
  16. protected readonly string baseUri;
  17. public BaseHttpClient(HttpClient httpClient, string baseUri)
  18. {
  19. _httpClient = httpClient;
  20. this.baseUri = baseUri;
  21. }
  22. public HttpRespResult sendRequest<T>(string url, T data)
  23. {
  24. return sendRequest(url, new(), data);
  25. }
  26. public HttpRespResult sendRequest<T>(string url, Dictionary<string, string> headers, T data)
  27. {
  28. var response = _httpClient.SendAsync(createRequest(reHandleUrl(url, data), headers, getMethod(), handleData(data))).Result;
  29. var rs = response.Content.ReadAsStringAsync().Result;
  30. return handleResult(response, rs);
  31. }
  32. /// <summary>
  33. /// 处理数据
  34. /// </summary>
  35. /// <param name="data"></param>
  36. /// <returns></returns>
  37. protected abstract HttpContent? handleData<T>(T data);
  38. /// <summary>
  39. /// 当前请求类型
  40. /// </summary>
  41. /// <returns></returns>
  42. protected abstract HttpMethod getMethod();
  43. /// <summary>
  44. /// 处理url,针对get等部分请求可能需要将参数放在url后面,此处做处理
  45. /// </summary>
  46. /// <param name="url"></param>
  47. /// <param name="data"></param>
  48. /// <returns></returns>
  49. protected virtual string reHandleUrl<T>(string url, T data)
  50. {
  51. if (baseUri.EndsWith("/"))
  52. {
  53. if (url.StartsWith("/"))
  54. {
  55. url = url[1..];
  56. }
  57. return baseUri + url;
  58. }
  59. else
  60. {
  61. if (url.StartsWith("/"))
  62. {
  63. return baseUri + url;
  64. }
  65. else
  66. {
  67. return baseUri + "/" + url;
  68. }
  69. }
  70. }
  71. /// <summary>
  72. /// 创建请求对象
  73. /// </summary>
  74. /// <param name="url"></param>
  75. /// <param name="headers"></param>
  76. /// <param name="method"></param>
  77. /// <param name="content"></param>
  78. /// <returns></returns>
  79. protected HttpRequestMessage createRequest(string url, Dictionary<string, string> headers, HttpMethod method, HttpContent? content)
  80. {
  81. var request = new HttpRequestMessage
  82. {
  83. Method = method,
  84. RequestUri = new Uri(url),
  85. Content = content
  86. };
  87. foreach (var head in headers)
  88. {
  89. request.Headers.Add(head.Key, head.Value);
  90. }
  91. return request;
  92. }
  93. /// <summary>
  94. /// 解析结果
  95. /// </summary>
  96. /// <param name="response"></param>
  97. /// <param name="rs"></param>
  98. /// <returns></returns>
  99. protected HttpRespResult handleResult(HttpResponseMessage response, string rs)
  100. {
  101. return new HttpRespResult()
  102. {
  103. code = response.IsSuccessStatusCode ? 200 : -1,
  104. message = response.IsSuccessStatusCode ? "发送成功" : rs,
  105. data = rs
  106. };
  107. }
  108. /// <summary>
  109. /// 类型转换
  110. /// </summary>
  111. /// <typeparam name="T"></typeparam>
  112. /// <param name="data"></param>
  113. /// <returns></returns>
  114. protected Dictionary<string, string> convertObj2Dict<T>(T data)
  115. {
  116. Dictionary<string, string> dict = new Dictionary<string, string>();
  117. if (data != null)
  118. {
  119. if (data is Dictionary<string, string>)
  120. {
  121. //若对象本身即是dictionary则直接返回
  122. return data as Dictionary<string, string>;
  123. }
  124. else if (data is IEnumerable || data.GetType().IsArray)
  125. {
  126. throw new Exception("不支持的转换类型");
  127. }
  128. else
  129. {
  130. return JsonConvert.DeserializeObject<Dictionary<string, string>>(JsonConvert.SerializeObject(data, new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" }));
  131. }
  132. }
  133. return dict;
  134. }
  135. }
  136. }