Request.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. using System.Net;
  2. using System.Net.Http.Headers;
  3. using System.Text;
  4. using System.Text.Json;
  5. using Long.Core.Api;
  6. using Long.Core.Extensions;
  7. using Long.Utils.Cache;
  8. namespace Long.Utils.Network;
  9. /// <summary>
  10. /// 网络请求类
  11. /// </summary>
  12. public static class Request
  13. {
  14. private static readonly string _ObjectCachingkey = "Long.Utils.Request.Authorization";
  15. /// <summary>
  16. /// 设置认证信息
  17. /// </summary>
  18. /// <param name="authorization"></param>
  19. /// <returns></returns>
  20. public static async Task SetAuthorization(LongToken token)
  21. {
  22. if (ObjectCaching.Contains(_ObjectCachingkey))
  23. {
  24. ObjectCaching.Remove(_ObjectCachingkey);
  25. }
  26. ObjectCaching.Add(_ObjectCachingkey, token);
  27. }
  28. /// <summary>
  29. /// 请求数据
  30. /// </summary>
  31. /// <typeparam name="T"></typeparam>
  32. /// <param name="url"></param>
  33. /// <param name="isToken"> 是否使用 token,默认 true</param>
  34. /// <returns></returns>
  35. public static async Task<RequestResult<T>> GetAsync<T>(string url, bool isToken = true)
  36. {
  37. return await GetAsync<T>(url, null, isToken);
  38. }
  39. /// <summary>
  40. /// 请求数据
  41. /// </summary>
  42. /// <typeparam name="T"></typeparam>
  43. /// <param name="url"></param>
  44. /// <param name="param">请求参数</param>
  45. /// <param name="isToken"> 是否使用 token,默认 true</param>
  46. /// <returns></returns>
  47. public static async Task<RequestResult<T>> GetAsync<T>(string url, object param, bool isToken = true)
  48. {
  49. var result = new RequestResult<T>();
  50. try
  51. {
  52. var paramStr = "";
  53. bool hasUrlParam = url.IndexOf("?") > -1;
  54. if (param != null)
  55. {
  56. Type type = param.GetType();
  57. foreach (var item in type.GetProperties())
  58. {
  59. if (hasUrlParam)
  60. {
  61. paramStr += "&";
  62. }
  63. else
  64. {
  65. hasUrlParam = true;
  66. paramStr += "?";
  67. }
  68. paramStr += item.Name + "=" + item.GetValue(param).ToString();
  69. }
  70. url += paramStr;
  71. }
  72. HttpClient client = null;
  73. if (isToken)
  74. {
  75. client = GetTokenHttpClient();
  76. }
  77. else
  78. {
  79. client = GetHttpClient();
  80. }
  81. var httpResponse = await client.GetAsync(url);
  82. var bytes = await httpResponse.Content.ReadAsByteArrayAsync();
  83. result.StatusCode = httpResponse.StatusCode;
  84. var decodeStr = Encoding.UTF8.GetString(bytes);
  85. if (decodeStr.IsXML() && decodeStr.IndexOf("meta charset=\"gb2312\"") > 0)
  86. {
  87. decodeStr = Encoding.GetEncoding("gb2312").GetString(bytes);
  88. }
  89. if (httpResponse.StatusCode == HttpStatusCode.OK)
  90. {
  91. var res = decodeStr.IsJSON() ? JsonSerializer.Deserialize<ApiResult<T>>(decodeStr) : new ApiResult<T>()
  92. {
  93. Success = false,
  94. Result = default(T),
  95. Message = ""
  96. };
  97. if (res.Success)
  98. {
  99. result.Success = true;
  100. result.Result = res.Result;
  101. }
  102. else
  103. {
  104. result.Success = false;
  105. result.Message = res.Message;
  106. }
  107. }
  108. else
  109. {
  110. result.Success = false;
  111. result.Result = default(T);
  112. result.Message = decodeStr;
  113. }
  114. }
  115. catch (Exception ex)
  116. {
  117. result.Success = false;
  118. result.Result = default(T);
  119. result.Message = ex.Message;
  120. }
  121. return result;
  122. }
  123. public static async Task<RequestResult<string>> GetAsync(string url, bool isToken = true)
  124. {
  125. return await GetAsync(url, null, isToken);
  126. }
  127. public static async Task<RequestResult<string>> GetAsync(string url, object param, bool isToken = true)
  128. {
  129. var result = new RequestResult<string>();
  130. try
  131. {
  132. var paramStr = "";
  133. bool hasUrlParam = url.IndexOf("?") > -1;
  134. if (param != null)
  135. {
  136. Type type = param.GetType();
  137. foreach (var item in type.GetProperties())
  138. {
  139. if (hasUrlParam)
  140. {
  141. paramStr += "&";
  142. }
  143. else
  144. {
  145. hasUrlParam = true;
  146. paramStr += "?";
  147. }
  148. paramStr += item.Name + "=" + item.GetValue(param).ToString();
  149. }
  150. url += paramStr;
  151. }
  152. HttpClient client = null;
  153. if (isToken)
  154. {
  155. client = GetTokenHttpClient();
  156. }
  157. else
  158. {
  159. client = GetHttpClient();
  160. }
  161. var httpResponse = await client.GetAsync(url);
  162. var bytes = await httpResponse.Content.ReadAsByteArrayAsync();
  163. result.StatusCode = httpResponse.StatusCode;
  164. var decodeStr = Encoding.UTF8.GetString(bytes);
  165. if (decodeStr.IsXML() && decodeStr.IndexOf("meta charset=\"gb2312\"") > 0)
  166. {
  167. decodeStr = Encoding.GetEncoding("gb2312").GetString(bytes);
  168. }
  169. if (httpResponse.StatusCode == HttpStatusCode.OK)
  170. {
  171. result.Success = true;
  172. result.Result = decodeStr;
  173. }
  174. else
  175. {
  176. result.Success = false;
  177. result.Message = decodeStr;
  178. }
  179. }
  180. catch (Exception ex)
  181. {
  182. result.Success = false;
  183. result.Message = ex.Message;
  184. }
  185. return result;
  186. }
  187. /// <summary>
  188. /// 发送数据
  189. /// </summary>
  190. /// <typeparam name="T"></typeparam>
  191. /// <param name="url"></param>
  192. /// <param name="isToken"></param>
  193. /// <returns></returns>
  194. public static async Task<RequestResult<T>> PostAsync<T>(string url, bool isToken = true)
  195. {
  196. return await PostAsync<T>(null, url, isToken);
  197. }
  198. public static async Task<RequestResult<T>> PostAsync<T>(HttpContent httpContent, string url, bool isToken = true)
  199. {
  200. var result = new RequestResult<T>();
  201. HttpClient client = null;
  202. try
  203. {
  204. if (isToken)
  205. {
  206. client = GetTokenHttpClient();
  207. }
  208. else
  209. {
  210. client = GetHttpClient();
  211. }
  212. if (httpContent == null)
  213. {
  214. httpContent = new StringContent("");
  215. }
  216. var httpResponse = await client.PostAsync(url, httpContent);
  217. var bytes = await httpResponse.Content.ReadAsByteArrayAsync();
  218. result.StatusCode = httpResponse.StatusCode;
  219. var decodeStr = Encoding.UTF8.GetString(bytes);
  220. if (decodeStr.IsXML() && decodeStr.IndexOf("meta charset=\"gb2312\"") > 0)
  221. {
  222. decodeStr = Encoding.GetEncoding("gb2312").GetString(bytes);
  223. }
  224. if (httpResponse.StatusCode == HttpStatusCode.OK)
  225. {
  226. var res = decodeStr.IsJSON() ? JsonSerializer.Deserialize<ApiResult<T>>(decodeStr) : new ApiResult<T>()
  227. {
  228. Success = false,
  229. Result = default(T),
  230. Message = ""
  231. };
  232. if (res.Success)
  233. {
  234. result.Success = true;
  235. result.Result = res.Result;
  236. }
  237. else
  238. {
  239. result.Success = false;
  240. result.Message = res.Message;
  241. }
  242. }
  243. else
  244. {
  245. result.Success = false;
  246. result.Result = default(T);
  247. result.Message = decodeStr;
  248. }
  249. }
  250. catch (Exception ex)
  251. {
  252. result.Success = false;
  253. result.Result = default(T);
  254. result.Message = ex.Message.IndexOf("Timeout of") > 0 ? "" : ex.Message;
  255. }
  256. return result;
  257. }
  258. public static async Task<RequestResult<string>> PostAsync(string url, bool isToken = true)
  259. {
  260. return await PostAsync(url, null, isToken);
  261. }
  262. public static async Task<RequestResult<string>> PostAsync(HttpContent httpContent, string url, bool isToken = true)
  263. {
  264. var result = new RequestResult<string>();
  265. HttpClient client = null;
  266. try
  267. {
  268. if (isToken)
  269. {
  270. client = GetTokenHttpClient();
  271. }
  272. else
  273. {
  274. client = GetHttpClient();
  275. }
  276. if (httpContent == null)
  277. {
  278. httpContent = new StringContent("");
  279. }
  280. var httpResponse = await client.PostAsync(url, httpContent);
  281. var bytes = await httpResponse.Content.ReadAsByteArrayAsync();
  282. result.StatusCode = httpResponse.StatusCode;
  283. var decodeStr = Encoding.UTF8.GetString(bytes);
  284. if (decodeStr.IsXML() && decodeStr.IndexOf("meta charset=\"gb2312\"") > 0)
  285. {
  286. decodeStr = Encoding.GetEncoding("gb2312").GetString(bytes);
  287. }
  288. if (httpResponse.StatusCode == HttpStatusCode.OK)
  289. {
  290. result.Success = true;
  291. result.Result = decodeStr;
  292. }
  293. else
  294. {
  295. result.Success = false;
  296. result.Message = decodeStr;
  297. }
  298. }
  299. catch (Exception ex)
  300. {
  301. result.Success = false;
  302. result.Message = ex.Message.IndexOf("Timeout of") > 0 ? "" : ex.Message;
  303. }
  304. return result;
  305. }
  306. /// <summary>
  307. /// 发送数据
  308. /// </summary>
  309. /// <typeparam name="T"></typeparam>
  310. /// <param name="url"></param>
  311. /// <param name="data"></param>
  312. /// <param name="isToken"> 是否使用 token,默认 true</param>
  313. /// <returns></returns>
  314. public static async Task<RequestResult<T>> PostAsync<T>(string url, object data, bool isToken = true)
  315. {
  316. var content = Request.GetStringContent(data, Encoding.UTF8, "text/json");
  317. return await Request.PostAsync<T>(content, url, isToken);
  318. }
  319. /// <summary>
  320. /// 发送数据
  321. /// </summary>
  322. /// <typeparam name="T"></typeparam>
  323. /// <param name="url"></param>
  324. /// <param name="data"></param>
  325. /// <param name="isToken"> 是否使用 token,默认 true</param>
  326. /// <returns></returns>
  327. public static async Task<RequestResult<string>> PostAsync(string url, object data, bool isToken = true)
  328. {
  329. var content = Request.GetStringContent(data, Encoding.UTF8, "text/json");
  330. return await Request.PostAsync(content, url, isToken);
  331. }
  332. public static async Task<RequestResult<T>> PostFormUrlEncodedAsync<T>(string url, object data, bool isToken = true)
  333. {
  334. var content = Request.GetFormUrlEncodedContent(data);
  335. return await Request.PostAsync<T>(content, url, isToken);
  336. }
  337. /// <summary>
  338. /// 获取 HttpClient 对象
  339. /// </summary>
  340. /// <returns></returns>
  341. public static HttpClient GetHttpClient()
  342. {
  343. HttpClient client = new HttpClient();
  344. client.DefaultRequestHeaders.Add("KeepAlive", "false");
  345. return client;
  346. }
  347. /// <summary>
  348. /// 获取带 Token 的 HttpClient 对象
  349. /// </summary>
  350. /// <returns></returns>
  351. public static HttpClient GetTokenHttpClient()
  352. {
  353. HttpClient client = GetHttpClient();
  354. var token = ObjectCaching.Get<LongToken>(_ObjectCachingkey);
  355. if (token != null)
  356. {
  357. client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(token.token_type, token.access_token);
  358. }
  359. return client;
  360. }
  361. public static StringContent GetStringContent(object data, Encoding encoding, string type)
  362. {
  363. var dataStr = JsonSerializer.Serialize(data);
  364. return new StringContent(dataStr, encoding, type);
  365. }
  366. public static FormUrlEncodedContent GetFormUrlEncodedContent(object data)
  367. {
  368. var result = new List<KeyValuePair<string, string>>();
  369. var type = data.GetType();
  370. foreach (var item in type.GetProperties())
  371. {
  372. string value = item.GetValue(data)?.ToString() ?? "";
  373. result.Add(new KeyValuePair<string, string>(item.Name, value));
  374. }
  375. return new FormUrlEncodedContent(result);
  376. }
  377. public static MultipartFormDataContent GetMultipartFormDataContent(object data)
  378. {
  379. var result = new MultipartFormDataContent();
  380. result.Add(Request.GetFormUrlEncodedContent(data));
  381. return result;
  382. }
  383. }
  384. /// <summary>
  385. /// 网络请求结果类
  386. /// </summary>
  387. /// <typeparam name="T"></typeparam>
  388. public class RequestResult<T>
  389. {
  390. public T Result { get; set; }
  391. public bool Success { get; set; }
  392. public string Message { get; set; }
  393. public HttpStatusCode StatusCode { get; set; }
  394. }