用 C# 调用 Web API,最常用、推荐的方式就是 HttpClient。它轻量、高效、支持异步,是 .NET 中发起 HTTP 请求的标准工具。
创建并复用 HttpClient 实例
HttpClient 不是“一次性的”,设计上就该被重用(不是每次请求都 new 一个)。频繁创建会引发端口耗尽等问题。
推荐在类级别或应用生命周期内声明一个静态或单例的 HttpClient 实例 不要在 using 语句里包裹 HttpClient(会导致连接过早关闭) 如需自定义配置(如超时、默认 Header),可通过 HttpClientHandler 或直接设置属性发送 GET 请求获取数据
最常见场景:从 API 拉取 JSON 数据。
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
<p>string url = "<a href="https://www.php.cn/link/93a819cbd635bd1505ef0f804c21cc2a">https://www.php.cn/link/93a819cbd635bd1505ef0f804c21cc2a</a>";
string responseJson = await client.GetStringAsync(url);
var users = JsonSerializer.Deserialize<List<User>>(responseJson);
说明:GetStringAsync 自动读取响应体并返回字符串;也可用 GetAsync + ReadAsStringAsync 更灵活控制。
发送 POST 请求提交数据
传 JSON 数据到 API,注意设置 Content-Type 和序列化内容:
用 JsonContent(.NET 5+ 推荐)或 StringContent + 手动序列化 确保 API 端能正确解析 application/jsonvar user = new User { Name = "张三", Email = "zhang@example.com" };
var content = JsonContent.Create(user); // 自动设 Content-Type
<p>var response = await client.PostAsync("<a href="https://www.php.cn/link/93a819cbd635bd1505ef0f804c21cc2a">https://www.php.cn/link/93a819cbd635bd1505ef0f804c21cc2a</a>", content);
response.EnsureSuccessStatusCode(); // 抛异常如果状态码非 2xx</p><p>string result = await response.Content.ReadAsStringAsync();
处理错误与超时
网络请求不可靠,必须主动应对失败:
用 try-catch 捕获 HttpRequestException(网络、DNS、4xx/5xx 响应等) 设置 Timeout(单位:TimeSpan),避免请求无限挂起 检查 response.IsSuccessStatusCode 再读取内容,避免解析空/错误响应体示例:
client.Timeout = TimeSpan.FromSeconds(10);
<p>try {
var response = await client.GetAsync(url);
if (response.IsSuccessStatusCode) {
var data = await response.Content.ReadFromJsonAsync<ApiResponse>();
} else {
Console.WriteLine($"API 返回错误: {response.StatusCode}");
}
}
catch (HttpRequestException ex) {
Console.WriteLine($"请求失败: {ex.Message}");
}
基本上就这些。用好 HttpClient 的关键是:复用实例、善用 async/await、主动处理异常和状态码。不复杂但容易忽略细节。
