C# HTTP客户端:从A到Z正确发起请求
\n\n在.NET平台的现代开发中,处理HTTP请求是一项关键任务。无论是与外部REST API集成、向服务器发送数据还是下载网页——在C#中正确使用HttpClient对于应用程序的性能和稳定性至关重要。本文将全面解析C#中HTTP客户端的使用:从基础示例到高级技术、错误处理和最佳实践。
1. C#中HttpClient的基础知识
\n\nHttpClient是.NET中用于发送HTTP请求和接收响应的主要类。它位于System.Net.Http命名空间中,从.NET Framework 4.5及所有版本的.NET Core/.NET 5+开始可用。
重要规则: HttpClient设计用于重复使用。为每个请求创建新实例是一种反模式,可能导致套接字耗尽(socket exhaustion)。应改用单个静态或单例实例。
GET请求的基础示例:
\n\nusing System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\n\nclass Program\n{\n private static readonly HttpClient client = new HttpClient();\n\n static async Task Main(string[] args)\n {\n try\n {\n HttpResponseMessage response = await client.GetAsync("https://api.example.com/data");\n response.EnsureSuccessStatusCode();\n string responseBody = await response.Content.ReadAsStringAsync();\n Console.WriteLine(responseBody);\n }\n catch (HttpRequestException e)\n {\n Console.WriteLine($"请求错误: {e.Message}");\n }\n }\n}\n\n在此示例中,我们创建了一个静态的HttpClient,发送GET请求,使用EnsureSuccessStatusCode()检查响应是否成功,并将响应正文作为字符串读取。
2. HTTP请求类型与标头处理
\n\n除了GET之外,HttpClient支持所有主要的HTTP方法:POST、PUT、DELETE、PATCH等。让我们看看如何发送带有JSON数据的POST请求——这是使用REST API时最常见的场景。
带JSON的POST请求示例:
\n\nusing System;\nusing System.Net.Http;\nusing System.Text;\nusing System.Text.Json;\nusing System.Threading.Tasks;\n\nclass Program\n{\n private static readonly HttpClient client = new HttpClient();\n\n static async Task Main(string[] args)\n {\n var data = new { Name = "John", Age = 30 };\n string json = JsonSerializer.Serialize(data);\n var content = new StringContent(json, Encoding.UTF8, "application/json");\n\n try\n {\n HttpResponseMessage response = await client.PostAsync("https://api.example.com/users", content);\n response.EnsureSuccessStatusCode();\n string result = await response.Content.ReadAsStringAsync();\n Console.WriteLine($"用户已创建: {result}");\n }\n catch (HttpRequestException e)\n {\n Console.WriteLine($"错误: {e.Message}");\n }\n }\n}\n\n处理标头: API通常需要传递身份验证令牌或其他标头。可以通过两种方式添加:
\n\n- \n
- 全局设置——通过
DefaultRequestHeaders属性(适用于客户端的所有请求)。 \n - 局部设置——通过
HttpRequestMessage对象中的Headers集合(适用于特定请求)。 \n
添加Authorization标头的示例:
\n\n// 全局设置\nclient.DefaultRequestHeaders.Authorization = \n new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", "your-token");\n\n// 局部设置\nvar request = new HttpR