如何在 .NET 中通过 C# 发送 HTTP POST 请求:从简单到复杂
\n\n想象一下,你的 C# 应用程序就像一名快递员,需要将一个包裹(数据)送到指定地址(URL),并获取回执(响应)。这正是 HTTP POST 请求 所要解决的问题。在 Stack Overflow 上,这个问题吸引了数千次浏览,原因很简单:与外部 API 交互、提交表单、向服务器上传数据——这些是任何 .NET 开发者的日常工作。
\n\n在本文中,我们将介绍在 .NET (C#) 中发送 POST 请求的三种主要方式,从现代的 HttpClient 开始,到“传统的” WebRequest 结束。你将学习如何传输 JSON、URL 编码数据,如何处理错误,以及如何避免那些新手容易踩到的坑。我们开始吧!
1. 现代方式:HttpClient(推荐)
\n\n从 .NET Framework 4.5 开始,以及所有版本的 .NET Core / .NET 5+ 中,HttpClient 类已成为事实上的标准。它专为异步操作设计,支持连接复用,并且易于配置。
1.1. 使用 JSON 发送简单 POST(最常见场景)
\n\n假设我们需要将用户数据以 JSON 格式发送到服务器。实际代码如下所示:
\n\nusing System;\nusing System.Net.Http;\nusing System.Text;\nusing System.Text.Json;\nusing System.Threading.Tasks;\n\npublic class UserService\n{\n private readonly HttpClient _httpClient;\n\n public UserService(HttpClient httpClient)\n {\n _httpClient = httpClient;\n }\n\n public async Task<UserResponse> CreateUserAsync(UserDto newUser)\n {\n // 1. 将对象序列化为 JSON\n var json = JsonSerializer.Serialize(newUser);\n var content = new StringContent(json, Encoding.UTF8, "application/json");\n\n // 2. 发送 POST 请求\n HttpResponseMessage response = await _httpClient.PostAsync("https://api.example.com/users", content);\n\n // 3. 读取响应\n response.EnsureSuccessStatusCode(); // 如果状态码不是 2xx,将抛出异常\n\n var responseBody = await response.Content.ReadAsStringAsync();\n return JsonSerializer.Deserialize<UserResponse>(responseBody);\n }\n}\n\n// 使用示例\npublic class Program\n{\n public static async Task Main()\n {\n var client = new HttpClient();\n var service = new UserService(client);\n \n var user = new UserDto { Name = "Ivan", Email = "ivan@example.com" };\n var result = await service.CreateUserAsync(user);\n Console.WriteLine($"Created user ID: {result.Id}");\n }\n}\n\npublic class UserDto\n{\n public string Name { get; set; }\n public string Email { get; set; }\n}\n\npublic class UserResponse\n{\n public int Id { get; set; }\n}\n\n重要提示:
\n- \n
- 始终使用
async/await——这可以防止线程阻塞。 \n EnsureSuccessStatusCode()——是你快速检查错误的最佳帮手。 \n - 不要为每个请求都创建一个新的
HttpClient——这会导致 套接字耗尽。在 ASP.NET Core 中使用IHttpClientFactory,或者使用一个静态单例实例。 \n
1.2. 使用表单数据发送 POST(application/x-www-form-urlencoded)
\n\n有时 API 需要的数据格式是普通的 HTML 表单。这种情况下,我们使用 FormUrlEncodedContent:
public async Task<string> PostFormDataAsync(string username, string password)\n{\n var formData = new Dictionary<string, string>\n {\n { "grant_type", "password" },\n { "username", username },\n { "password", password }\n };\n\n var content = new FormUrlEncodedContent(formData);\n\n using var client = new HttpClient();\n var response = awa