using System; using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; public class HttpHelper { private static readonly HttpClient client = new HttpClient(); /// /// 判断是否为 URL /// public static bool IsUrl(string url) { if (string.IsNullOrEmpty(url)) return false; url = url.ToLower(); return url.StartsWith("http://") || url.StartsWith("https://"); } /// /// 异步 GET 请求 /// public static async Task HttpGetAsync(string url, int timeout = 10 * 1000) { try { // 设置超时时间 client.Timeout = TimeSpan.FromMilliseconds(timeout); HttpResponseMessage response = await client.GetAsync(url); response.EnsureSuccessStatusCode(); string content = await response.Content.ReadAsStringAsync(); return new HttpResponse(response.StatusCode, content); } catch (HttpRequestException ex) { Console.WriteLine($"GET Request Error: {ex.Message}"); return new HttpResponse(HttpStatusCode.BadRequest, $"Error: {ex.Message}"); } catch (TaskCanceledException ex) { Console.WriteLine($"Request Timeout or Cancelled: {ex.Message}"); return new HttpResponse(HttpStatusCode.RequestTimeout, "Request timed out."); } catch (Exception ex) { Console.WriteLine($"Unexpected Error: {ex.Message}"); return new HttpResponse(HttpStatusCode.InternalServerError, $"Unexpected error: {ex.Message}"); } } /// /// 异步 POST 请求 /// public static async Task HttpPostAsync(string postUrl, T postData, string contentType = "application/json", int timeout = 10 * 1000) { try { // 设置超时时间 client.Timeout = TimeSpan.FromMilliseconds(timeout); string jsonContent = JsonConvert.SerializeObject(postData); var content = new StringContent(jsonContent, Encoding.UTF8, contentType); HttpResponseMessage response = await client.PostAsync(postUrl, content); response.EnsureSuccessStatusCode(); string responseBody = await response.Content.ReadAsStringAsync(); return new HttpResponse(response.StatusCode, responseBody); } catch (HttpRequestException ex) { Console.WriteLine($"POST Request Error: {ex.Message}"); return new HttpResponse(HttpStatusCode.BadRequest, $"Error: {ex.Message}"); } catch (TaskCanceledException ex) { Console.WriteLine($"Request Timeout or Cancelled: {ex.Message}"); return new HttpResponse(HttpStatusCode.RequestTimeout, "Request timed out."); } catch (Exception ex) { Console.WriteLine($"Unexpected Error: {ex.Message}"); return new HttpResponse(HttpStatusCode.InternalServerError, $"Unexpected error: {ex.Message}"); } } /// /// 根据传入的数据,得到相应页面数据(适用于复杂的 HTTP 请求) /// public static async Task GetHttpRequestDataAsync(HttpItem httpItem) { using (var requestMessage = new HttpRequestMessage()) { try { // 设置请求方法 requestMessage.Method = new HttpMethod(httpItem.Method); requestMessage.RequestUri = new Uri(GetUrl(httpItem.URL)); // 设置请求头 foreach (var header in httpItem.Headers ?? Array.Empty>()) { requestMessage.Headers.Add(header.Key, header.Value); } // 设置内容类型 if (!string.IsNullOrEmpty(httpItem.ContentType)) { requestMessage.Content = new StringContent(httpItem.Postdata!, Encoding.UTF8, httpItem.ContentType); } // 设置 Cookie if (!string.IsNullOrEmpty(httpItem.Cookie)) { requestMessage.Headers.Add("Cookie", httpItem.Cookie); } // 发送请求并获取响应 HttpResponseMessage response = await client.SendAsync(requestMessage); response.EnsureSuccessStatusCode(); string content = await response.Content.ReadAsStringAsync(); return new HttpResponse(response.StatusCode, content); } catch (Exception ex) { Console.WriteLine($"Request Error: {ex.Message}"); return new HttpResponse(HttpStatusCode.InternalServerError, $"Error: {ex.Message}"); } } } /// /// 确保 URL 包含协议前缀 /// private static string GetUrl(string url) { if (!(url.Contains("http://") || url.Contains("https://"))) { url = "http://" + url; } return url; } } /// /// HTTP 响应结果类 /// public class HttpResponse { public HttpStatusCode StatusCode { get; set; } public string Content { get; set; } public HttpResponse(HttpStatusCode statusCode, string content) { StatusCode = statusCode; Content = content; } } /// /// HTTP 请求项类 /// public class HttpItem { public string URL { get; set; } = ""; public string Method { get; set; } = "GET"; public int Timeout { get; set; } = 10000; public string ContentType { get; set; } = "application/json"; public string? Postdata { get; set; } public string? Cookie { get; set; } public KeyValuePair[] Headers { get; set; }=new KeyValuePair[0]; }