HttpHelper.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. using Newtonsoft.Json;
  2. using System;
  3. using System.Collections.Concurrent;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Net.Http;
  7. using System.Net.Http.Headers;
  8. using System.Threading.Tasks;
  9. namespace Host
  10. {
  11. /// <summary>
  12. /// 请求帮助类
  13. /// </summary>
  14. public class HttpHelper
  15. {
  16. public static readonly HttpHelper Instance;
  17. static HttpHelper()
  18. {
  19. Instance = new HttpHelper();
  20. }
  21. /// <summary>
  22. /// 不同url分配不同HttpClient
  23. /// </summary>
  24. public static ConcurrentDictionary<string, HttpClient> dictionary = new ConcurrentDictionary<string, HttpClient>();
  25. private HttpClient GetHttpClient(string url)
  26. {
  27. var uri = new Uri(url);
  28. var key = uri.Scheme + uri.Host;
  29. //if (!dictionary.Keys.Contains(key))
  30. return dictionary.GetOrAdd(key, new HttpClient());
  31. //return dictionary[key];
  32. }
  33. /// <summary>
  34. /// Post请求
  35. /// </summary>
  36. /// <param name="url">url地址</param>
  37. /// <param name="jsonString">请求参数(Json字符串)</param>
  38. /// <param name="headers">webapi做用户认证</param>
  39. /// <returns></returns>
  40. public async Task<HttpResponseMessage> PostAsync(string url, string jsonString, Dictionary<string, string> headers = null)
  41. {
  42. if (string.IsNullOrWhiteSpace(jsonString))
  43. jsonString = "{}";
  44. StringContent content = new StringContent(jsonString);
  45. content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
  46. if (headers != null && headers.Any())
  47. {
  48. //如果有headers认证等信息,则每个请求实例一个HttpClient
  49. using (HttpClient http = new HttpClient())
  50. {
  51. foreach (var item in headers)
  52. {
  53. http.DefaultRequestHeaders.Remove(item.Key);
  54. http.DefaultRequestHeaders.TryAddWithoutValidation(item.Key, item.Value);
  55. }
  56. return await http.PostAsync(new Uri(url), content);
  57. }
  58. }
  59. else
  60. {
  61. return await GetHttpClient(url).PostAsync(new Uri(url), content);
  62. }
  63. }
  64. /// <summary>
  65. /// Post请求
  66. /// </summary>
  67. /// <typeparam name="T"></typeparam>
  68. /// <param name="url">url地址</param>
  69. /// <param name="content">请求参数</param>
  70. /// <param name="headers">webapi做用户认证</param>
  71. /// <returns></returns>
  72. public async Task<HttpResponseMessage> PostAsync<T>(string url, T content, Dictionary<string, string> headers = null) where T : class
  73. {
  74. return await PostAsync(url, JsonConvert.SerializeObject(content), headers);
  75. }
  76. /// <summary>
  77. /// Get请求
  78. /// </summary>
  79. /// <param name="url">url地址</param>
  80. /// <param name="headers">webapi做用户认证</param>
  81. /// <returns></returns>
  82. public async Task<HttpResponseMessage> GetAsync(string url, Dictionary<string, string> headers = null)
  83. {
  84. if (headers != null && headers.Any())
  85. {
  86. //如果有headers认证等信息,则每个请求实例一个HttpClient
  87. using (HttpClient http = new HttpClient())
  88. {
  89. foreach (var item in headers)
  90. {
  91. http.DefaultRequestHeaders.Remove(item.Key);
  92. http.DefaultRequestHeaders.TryAddWithoutValidation(item.Key, item.Value);
  93. }
  94. return await http.GetAsync(url);
  95. }
  96. }
  97. else
  98. {
  99. return await GetHttpClient(url).GetAsync(url);
  100. }
  101. }
  102. /// <summary>
  103. /// Put请求
  104. /// </summary>
  105. /// <param name="url">url地址</param>
  106. /// <param name="jsonString">请求参数(Json字符串)</param>
  107. /// <param name="headers">webapi做用户认证</param>
  108. /// <returns></returns>
  109. public async Task<HttpResponseMessage> PutAsync(string url, string jsonString, Dictionary<string, string> headers = null)
  110. {
  111. if (string.IsNullOrWhiteSpace(jsonString))
  112. jsonString = "{}";
  113. StringContent content = new StringContent(jsonString);
  114. content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
  115. if (headers != null && headers.Any())
  116. {
  117. //如果有headers认证等信息,则每个请求实例一个HttpClient
  118. using (HttpClient http = new HttpClient())
  119. {
  120. foreach (var item in headers)
  121. {
  122. http.DefaultRequestHeaders.Remove(item.Key);
  123. http.DefaultRequestHeaders.TryAddWithoutValidation(item.Key, item.Value);
  124. }
  125. return await http.PutAsync(url, content);
  126. }
  127. }
  128. else
  129. {
  130. return await GetHttpClient(url).PutAsync(url, content);
  131. }
  132. }
  133. /// <summary>
  134. /// Put请求
  135. /// </summary>
  136. /// <typeparam name="T"></typeparam>
  137. /// <param name="url">url地址</param>
  138. /// <param name="content">请求参数</param>
  139. /// <param name="headers">webapi做用户认证</param>
  140. /// <returns></returns>
  141. public async Task<HttpResponseMessage> PutAsync<T>(string url, T content, Dictionary<string, string> headers = null)
  142. {
  143. return await PutAsync(url, JsonConvert.SerializeObject(content), headers);
  144. }
  145. /// <summary>
  146. /// Delete请求
  147. /// </summary>
  148. /// <param name="url"></param>
  149. /// <param name="headers">webapi做用户认证</param>
  150. /// <returns></returns>
  151. public async Task<HttpResponseMessage> DeleteAsync(string url, Dictionary<string, string> headers = null)
  152. {
  153. if (headers != null && headers.Any())
  154. {
  155. //如果有headers认证等信息,则每个请求实例一个HttpClient
  156. using (HttpClient http = new HttpClient())
  157. {
  158. foreach (var item in headers)
  159. {
  160. http.DefaultRequestHeaders.Remove(item.Key);
  161. http.DefaultRequestHeaders.TryAddWithoutValidation(item.Key, item.Value);
  162. }
  163. return await http.DeleteAsync(url);
  164. }
  165. }
  166. else
  167. {
  168. return await GetHttpClient(url).DeleteAsync(url);
  169. }
  170. }
  171. }
  172. }